文章目录
1. Spring Bean作用域:为什么Spring Bean需要多种作用域?
主要关注singleton和prototype类型的作用域,其他主要用于模板引擎,现在流行前后端分离,因此不过多关注。
2. “singleton” Bean作用域:单例Bean在当前Spring应用真是唯一的吗?
- 在BeanDefinition中
/**
* Return whether this a <b>Singleton</b>, with a single, shared instance
* returned on all calls.
* @see #SCOPE_SINGLETON
*/
boolean isSingleton();
/**
* Return whether this a <b>Prototype</b>, with an independent instance
* returned for each call.
* @since 3.0
* @see #SCOPE_PROTOTYPE
*/
boolean isPrototype();
- DefaultListableBeanFactory
方法:
private boolean isSingleton(String beanName, RootBeanDefinition mbd, @Nullable BeanDefinitionHolder dbd) {
return (dbd != null ? mbd.isSingleton() : isSingleton(beanName));
}
- FactoryBean
default boolean isSingleton() {
return true;
}
3.“prototype” Bean作用域:原型Bean在哪些场景下会创建新的实例?
注意事项
• Spring 容器没有办法管理 prototype Bean 的完整生命周期,也没有办法记录示例的存在。销毁回调方法将不会执行,可以利用 BeanPostProcessor 进行清扫工作。
结论一:
Singleton Bean 无论依赖查找还是依赖注入,均为同一个对象
Prototype Bean 无论依赖查找还是依赖注入,均为新生成的对象
结论二:
如果依赖注入集合类型的对象,Singleton Bean 和 Prototype Bean 均会存在一个
Prototype Bean 有别于其他地方的依赖注入 Prototype Bean
结论三:
无论是 Singleton 还是 Prototype Bean 均会执行初始化方法回调
不过仅 Singleton Bean 会执行销毁方法回调
4. “request” Bean 作用域
5. “session” Bean 作用域
6. “application” Bean 作用域
7. 自定义 Bean 作用域
8.面试