spring 八股

1.IOC的注入方式有哪些?

1.set注入
在这里插入图片描述

2.构造器注入
在这里插入图片描述
3.静态工厂的方法注入
静态工厂顾名思义,就是通过调用静态工厂的方法来获取自己需要的对象,为了让 spring 管理所有对象,我们不能直接通过"工程类.静态方法()"来获取对象,而是依然通过spring 注入的形式获取:
在这里插入图片描述
4.实例工厂的方法注入
实例工厂的意思是获取对象实例的方法不是静态的,所以你需要首先 new 工厂类,再调用普通的实例方法
在这里插入图片描述
在这里插入图片描述

2.BeanFactory与ApplicationContext?

二者都是IOC容器
实现BeanFactory接口的容器,是懒加载的,bean在容器启动时不会初始化,用到的时候才会初始化;而后者是饿汉式。

3.spring bean的作用域?

spring中,bean有如下几种作用域:

-----------------------------------------------------------------------------
singleton:单例模式:Spring IoC 容器中只会存在一个共享的 Bean 实例,无论有多少个Bean 引用它,始终指向同一对象。该模式在多线程下是不安全的。Singleton 作用域是Spring 中的缺省作用域,也可以显示的将 Bean 定义为 singleton 模式,配置为:

<bean id="userDao" class="com.ioc.UserDaoImpl" scope="singleton"/>

为了线程安全,可以用synchronized,加在方法上;或者用threadLocal

-----------------------------------------------------------------------------

prototype:原型模式,每次通过 Spring 容器获取 prototype 定义的 bean 时,容器都将创建一个新的 Bean 实例,每个 Bean 实例都有自己的属性和状态,而 singleton 全局只有一个对象。根据经验,对有状态的bean使用prototype作用域,而对无状态的bean使用singleton作用域。

-----------------------------------------------------------------------------

Request:一次 request 一个实例:request:在一次 Http 请求中,容器会返回该 Bean 的同一实例。而对不同的 Http 请求则会产生新的 Bean,而且该 bean 仅在当前 Http Request 内有效,当前 Http 请求结束,该 bean实例也将会被销毁

<bean id="loginAction" class="com.cnblogs.Login" scope="request"/>

-----------------------------------------------------------------------------
session:在一次 Http Session 中,容器会返回该 Bean 的同一实例。而对不同的 Session 请求则会创建新的实例,该 bean 实例仅在当前 Session 内有效。同 Http 请求相同,每一次session 请求创建新的实例,而不同的实例之间不共享属性,且实例仅在自己的 session 请求内有效,请求结束,则实例将被销毁。
-----------------------------------------------------------------------------
global Session:在一个全局的 Http Session 中,容器会返回该 Bean 的同一个实例,仅在使用 portlet context 时有效。
-----------------------------------------------------------------------------

4.bean的生命周期

在这里插入图片描述
在这里插入图片描述
实例化

  1. 实例化一个 Bean,也就是我们常说的 new。
    IOC 依赖注入
  2. 按照 Spring 上下文对实例化的 Bean 进行配置,也就是 IOC 注入。
    setBeanNameAware 实现
  3. 如果这个 Bean 已经实现了 BeanNameAware 接口,会调用它实现的 setBeanName(String)方法,此处传递的就是 Spring 配置文件中 Bean 的 id 值
    BeanFactoryAware 实现
  4. 如果这个 Bean 已经实现了 BeanFactoryAware 接口,会调用它实现的 setBeanFactory,setBeanFactory(BeanFactory)传递的是 Spring 工厂自身(可以用这个方式来获取其它 Bean,只需在 Spring 配置文件中配置一个普通的 Bean 就可以)。
    ApplicationContextAware 实现
  5. 如果这个 Bean 已经实现了 ApplicationContextAware 接口,会调用
    setApplicationContext(ApplicationContext)方法,传入 Spring 上下文(同样这个方式也可以实现步骤 4 的内容,但比 4 更好,因为 ApplicationContext 是 BeanFactory 的子接口,有更多的实现方法)
    postProcessBeforeInitialization 接口实现-初始化预处理
  6. 如果这个 Bean 关联了 BeanPostProcessor 接口,将会调用
    postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor 经常被用作是 Bean 内容的更改,并且由于这个是在 Bean 初始化结束时调用那个的方法,也可以被应用于内存或缓存技术。
    init-method
  7. 如果 Bean 在 Spring 配置文件中配置了 init-method 属性会自动调用其配置的初始化方法。
    postProcessAfterInitialization
  8. 如果这个 Bean 关联了 BeanPostProcessor 接口,将会调用
    postProcessAfterInitialization(Object obj, String s)方法。
    注:以上工作完成以后就可以应用这个 Bean 了,那这个 Bean 是一个 Singleton 的,所以一般情况下我们调用同一个 id 的 Bean 会是在内容地址相同的实例,当然在 Spring 配置文件中也可以配置非 Singleton。
    Destroy 过期自动清理阶段
  9. 当 Bean 不再需要时,会经过清理阶段,如果 Bean 实现了DisposableBean 这个接口,会调用那个其实现的 destroy()方法;
    destroy-method 自配置清理
  10. 最后,如果这个 Bean 的 Spring 配置中配置了 destroy-method 属性,会自动调用其配置的销毁方法。

5.五 种不同方式的自动装配

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值