Bean作用域
作用域 | 描述 |
---|---|
singleton | 在spring IoC容器仅存在一个Bean实例,Bean以单例方式存在,默认的作用域 |
prototype | 每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行newXxxBean() |
request | 每次HTTP request都会创建一个新的Bean,该作用域仅适用于WebApplicationContext环境 |
session | 同一个HTTP Session共享一个Bean,不同Session使用不同的Bean,仅适用于WebApplicationContext环境 |
global-session | 一般用于Portlet应用环境,该作用域仅适用于WebApplicationContext环境 |
- 当作用域为singleton时,IOC容器只会存在一个共享的实例,每次获取到的对象都是同一个对象
- Prototype在我们创建容器的时候并没有实例化,而是当我们获取bean的时候才会去创建一个对象,因此我们每次获取到的对象都不是同一个对象。
设置作用域
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)//将作用域设定为prototype
//@Scope("prototype")
public class MassageService {
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
使用@Scope注解来设置作用域
a.
b.
@Scope("prototype")
在spring boot里面,使用@Configuration(proxyBeanMethods = " ") 来设置作用域
proxyBeanMethods = true:单例模式
proxyBeanMethods = false:多例模式
Bean生命周期
这里的生命周期针对的是singleton Bean
(图源网络)
- 启动Spring,查找并加载需要被Spring管理的bean,进行Bean的实例化
- Bean实例化后进行属性注入
- 如果 Bean 实现了 BeanNameAware 接口,则 Spring 调用 Bean 的 setBeanName() 方法传入当前 Bean 的 id 值。
- 如果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 声明销毁方法,该方法也会被调用。
FactoryBean接口
FactoryBean是一个接口,需要创建一个类实现该接口
FactoryBean里面有三个方法:
getObject( ):通过一个对象交给IOC容器管理
getObjectType():设置所提供对象的类型
isSingleton():所提供的对象是否为单例
当把FactoryBean的实现类配置为bean时,会将当前类中getObject( )所返回的对象交给IOC容器管理。后期在SqlSessionFactory中会经常用到这种原理