简介
什么是spring bean:
- 通常来说,spring beans就是被spring容器管理的java对象
什么是spring容器:
- spring容器负责实例化,配置和装配spring beans
BeanFatory和ApplicationContext
BeanFatory接口
这是一个用来访问spring容器的root接口,要访问spring容器,我们将使用spring依赖注入功能,使用beanfatory接口和它的子接口
beanfatory是实现使用懒加载
的方式,这意味着beans只有在我们通过getBean()
方式直接调用它们的时候才进行实例化
特征:
- bean的实例化/串联
ApplicationContext接口
它是spring应用程序的中央接口,用于向应用程序提供配置信息
它继承了bean fatory接口,所以applicationContext包含beanFactory的所有功能和更多功能
它主要功能是支持大型的业务应用的创建
与beanFactory懒加载的方式不同,它是预加载
,所以,每一个bean都在applicationContext启动之后实例化
特性:
- bean instantiation/wring
- bean的实例化/串联
- 自动的BeanPostProcessor注册
- 自动的BeanFactoryPostProcessor注册
- 方便的MessageSource访问(i18n)
- applicationEvent的发布
初始化
InitializingBean
- 我们可以通过实现InitializingBean接口,在唯一方法afterPropertiesSet内完成实例化的工作
- 但是spring framework 官方并不建议我们通过这种方法来完成bean实例化,这是一种强耦合的方式,框架层面才会用到这个方法
PostConstruct
- 这种方式是spring非常提倡的一种方式,我们通常将其标记在方法上即可
- 通常将这个方法起名为init()
init-method
- 在
@Bean
的initMethod中指定初始化方法名称 - 和xml中bean标签的init-method属性类似
同时使用
调用顺序:
- @PostConstruct
- InitializingBean.afterPropertiesSet()
- init-method
BeanPostProcessor
- 接口里有方法postProcessorBeforeInitialization和postProcessorAfterInitialization
- 分别是在三种初始方式的前和后执行
aop在此实现
BeanFactoryPostProcessor
- 接口里有方法postProcessBeanFactory
- 管理bean工厂(实现FactoryBean接口)内所有的未实例化数据
spring boot在此实现
销毁
AbstractApplicationContext.registerShutdownHook()
DispasableBean
- 实现
DispasableBean
接口,在其唯一方法destroy
内完成bean销毁工作 - 但是spirng framework官方并不建议我们通过这种方法来销毁bean,这是一种强耦合的方式,框架层面才会用到这个方法
@PreDestroy
- spring非常提倡的一种方式,将其标记在方法上即可
- 通常起名为destory()
destroy-method
- 在
@Bean
的属性destroyMethod
中指定销毁方法 - 和xml的bean标签的destory-method属性类似
同时使用
调用顺序:
- @PreDestroy
- DisposableBean.destroy()
- destroy-method
bean的生命周期
- 调用构造器(constructor)
- 通过setter方法完成依赖注入,SDI(setter dependency injection)
- 依赖注入一旦结束,
BeanNameAware.setBeanName()
会被调用,它设置该bean在Bean Factory中的名称 - 接下来调用
BeanClassLoaderAware.setBeanClassLoader()
,为bean实例提供类加载器,所有类都需要通过类加载器加载到上下文 - 然后
BeanFactoryAware.setBeanFactory()
会被调用为bean实例提供其拥有的factory - 初始化
- 随时可用的bean
- 销毁
Aware
简介:
sware是spring中的一个根接口,继承该接口的子接口有很多
但是该接口没有任何方法,所有可用理解成一个标记接口
作用:
在实际项目中,不可避免要用到spring容器本身提供的资源,这时要让bean主动意识到spring容器的存在,才能调用spring提供的资源,这就是spring aware
常见子接口
aware子接口 | 描述 |
---|---|
BeanNameAware | 获取容器中bean的名称 |
BeanFactoryAware | 获取当前BeanFactory,这样可用调用容器的服务 |
ApplicationContextAware | 同上,获取applicationContext |
MessageSourceAware | 获取Message Source相关文本信息 |
ApplicationEventPubisherAware | 发布事件 |
ResourceLoaderAware | 获取资源加载器,这样获取外部资源文件 |