10.1 Spring基础
10.1.1 Spring 中的 bean 的作用域有哪些?
- singleton : 唯一 bean 实例,Spring 中的 bean 默认都是单例的。
- prototype : 每次请求都会创建一个新的 bean 实例。
- request : 每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTP request内有效。
- session : 每一次HTTP请求都会产生一个新的 bean,该bean仅在当前 HTTP session 内有效。
- global-session: 全局session作用域,仅仅在基于portlet的web应用中才有意义,Spring5已经没有了。Portlet是能够生成语义代码(例如:HTML)片段的小型Java Web插件。它们基于portlet容器,可以像servlet一样处理HTTP请求。但是,与 servlet 不同,每个 portlet 都有不同的会话。
10.1.2 Spring 中的 bean 生命周期?
-
Spring启动,查找并加载需要被Spring管理的bean,进行Bean的实例化。
-
Bean实例化后对将Bean的引入和值注入到Bean的属性中。
-
若Bean实现了BeanNameAware接口,Spring将Bean的Id传递给setBeanName()方法
-
若Bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入
-
若Bean实现了ApplicationContextAware接口,Spring将调用Bean的setApplicationContext()方法,将bean所在应用上下文引用传入进来。
-
若Bean实现了BeanPostProcessor接口,Spring就将调用他们的postProcessBeforeInitialization()方法。
-
若Bean 实现了InitializingBean接口,Spring将调用他们的afterPropertiesSet()方法。类似的,如果bean使用init-method声明了初始化方法,该方法也会被调用
-
若Bean 实现了BeanPostProcessor接口,Spring就将调用他们的postProcessAfterInitialization()方法。
-
此时,Bean已经准备就绪,可以被应用程序使用了。他们将一直驻留在应用上下文中,直到应用上下文被销毁。
-
如果bean实现了DisposableBean接口,Spring将调用它的destory()接口方法,同样,如果bean使用了destory-method 声明销毁方法,该方法也会被调用。
-
Spring中的bean生命周期流程图
-
使A和B两个bean按顺序加载的方法:初始化之前使用flag检查、使用@DependsOn(“User”)注解、使用@Order(1)注解、实现BeanFactoryPostProcessor接口。
-
Spring Bean循环依赖的解决方式
- 构造器参数循环依赖:无法解决,只能抛出BeanCurrentlyIn CreationException异常
- setter方式单例:先是构造实例化Bean对象,将这个实例化的对象放到单例对象工厂的cache(三级缓存)singletonFactories中。二级缓存:earlySingletonObjects ,提前暴光的单例对象的Cache,一级缓存:singletonObjects,单例对象的cache。
- setter方式原型,prototype:不能解决:Spring容器不会缓存。
-
spring解决循环依赖的实例。比如:单例的bean A 依赖 B,B又依赖A,
- 创建A,所有缓存中找不到,A实例化后放入三级缓存,A属性赋值,发现B;
- 创建B,所有缓存中找不到,B实例化后放入三级缓存,B属性赋值,发现A;
- A在三级缓存中已经存在,然后把A放入二级缓存,从三级缓存中删除,返回A;
- B初始化:将A注入到B的依赖属性中,B初始化完成;
- B初始化完成后,B会放入一级缓存中,从三级缓存中删除,返回B;
- A初始化,将B注入到A的依赖属性中,初始化A完成;
- A初始化完成后,A会放入一级缓存中,从二级缓存中删除,返回A。
-
BeanPostProcessor和BeanFactoryPostProcessor的区别:BeanPostProcessor是bean级别的处理,针对某个具体的bean进行处理,发生在实例化之后;BeanFactoryPostProcessor是BeanFactory级别的处理,是针对整个Bean的工厂进行处理,发生在实例化之前,刚被解析成BeanDefinition对象。
10.1.3 Spring中bean的注解?
- 将一个类声明为Spring的 bean 的注解有哪些?
- @Autowired 注解自动装配 bean,要想把类标识成