Solo  当前访客:1 开始使用


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

标签:
新一篇: Spring条件装配Bean:@Conditional注解 旧一篇: 观察者模式