Spring生命周期-初始化对象的过程
整体的流程(重要)
资源定位:@ComponentScan 扫描包
bean定义:将bean定义保存到BeanDefinition实例中
发布bean定义:装载到IoC中
实例化bean对象
依赖注入(属性赋值):如@Autowired的资源
检查实现的接口,并回调相关的接口实现
BeanPostProcessor的初始化前处理
bean 初始化方法
BeanPostProcessor的初始化后处理
这两个后置处理器,是在实例化bean之前被调用的
BeanDefinitionRegistryPostProcessor
BeanFactoryPostProcessor
Bean初始化之前的过程
扫描Bean、将Bean的定义装载到spring的容器中
单个Bean初始化时可实现的接口
BeanNameAware
public interface BeanNameAware {
void setBeanName(String name);
}初始化的获取当前Bean在spring容器中的唯一名称
BeanFactoryAware
public interface BeanFactoryAware {
void setBeanFactory(BeanFactory beanFactory) throws BeansException;
}可以获取bean所在的
BeanFactory的引用
ApplicationContextAware
public interface ApplicationContextAware {
void setApplicationContext(ApplicationContext applicationContext) throws BeansException;
}允许 bean 获取
ApplicationContext的引用,前提是当前容器是ApplicationContext
InitializingBean
public interface InitializingBean {
void afterPropertiesSet() throws Exception;
}bean初始化完毕(依赖初始化完成和属性初始化完成)之后可以调用的接口
要完成这个功能也可以在方法上增加注解:@PostConstruct 进行标记
DisposableBean
public interface DisposableBean {
void destroy() throws Exception;
}自定义销毁方法,当spring容器被销毁的时候调用的方法
要完成这个功能也可以在方法上增加注解:@PreDestory 进行标记
容器:BeanFactory和ApplicationtContext的关系
BeanFactory和ApplicationContext都是Spring框架中用于管理beans的重要接口
BeanFactory 不会初始化Bean,采用延迟初始化的方式,用的时候才去加载
ApplicationContext 扩展了BeanFactory,会初始化Bean
Bean的后置处理器
BeanPostProcessor接口
postProcessBeforeInitialization Bean的属性设置完毕和依赖注入完毕之后,init方法执行前,被调用的
postProcessAfterInitialization Bean的init当法调用之后,bean被使用前被调用的
额外注意的:
如果,采用@Configuration 和 @Bean 进行初始化第三方的类到spring容器中时,如何配置初始化方法呢?
观察@Bean注解的定义可看到,有个initMethod的属性,进行配置即可:
public @interface Bean { String[] name() default {}; Autowire autowire() default Autowire.NO; String initMethod() default ""; String destroyMethod() default "(inferred)"; }
标题:Spring生命周期-初始化对象的过程
作者:temp12138
地址:https://solo.mfyzl.icu/articles/2024/03/18/1710741174029.html
废话短说