0

Bean生命周期中的一些类

2024.10.11 | cuithink | 905次围观

16.1. ApplicationContextInitializer

常用于设置环境变量属性,IOC容器对象创建完以后执行。

public class myApplicationInitializer implements ApplicationContextInitializer {
    @Override
    public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
        Map<String, Object> hashMap = new HashMap();
        hashMap.put("myEnv", "test");
        //给上下文环境注入环境属性
        ConfigurableEnvironment environment = configurableApplicationContext.getEnvironment();
        MutablePropertySources propertySources = environment.getPropertySources();

        propertySources.addLast(new MapPropertySource("myMap",hashMap));
    }
}

//在META-INF/spring.factories下
# 接口全路径名=自定义类的全路径
org.springframework.context.ApplicationContextInitializer = org.example.controller.myApplicationInitializer

//获取
@Autowired
private Environment environment;
//注意这里要获取的是hashMap中的key
log.info(environment.getProperty("myEnv")); //test

16.2. ApplicationListener

监听事件,IOC容器发布事件之后执行,通用用于加载资源,定时任务发布等

@Slf4j
public class myListener implements ApplicationListener {
    @Override
    public void onApplicationEvent(ApplicationEvent applicationEvent) {
        if (applicationEvent instanceof ApplicationReadyEvent){
            log.info("容器初始化成功");
        }

        if (applicationEvent instanceof ApplicationFailedEvent){
            log.info("容器初始化成功");
        }
    }
}
//在META-INF/spring.factories下
org.springframework.context.ApplicationListener = org.example.controller.myListener

16.3. BeanFactory

Bean容器的根接口,提供Bean对象的创建,配置、依赖注入等功能

16.4. beanDefinition

  1. ScannedGenericBeanDefinition类主要用来处理@Component, @Controller, @Service, @Respository, @Configuration, ConfigurationClassBeanDefinition类主要用来处理@Bean

  2. 获取某个bean的beanDefinition,可以用context.getBeanFactory().getBeanDefinition("beanName")

  3. beanDefinition,用来描述Bean,包括bean的名称,Bean的属性,Bean的行为,实现的接口,添加的注解等,spring中,Bean在创建之前,都需要封装成beanDefinition,然后根据beanDefinition进一步创建bean对象

16.5. BeanFactoryPostProcessor

Bean工厂的后置处理器,当BeanFactory准备好了以后(beanFactory实例化后,Bean初始化前),会调用该接口的PostProcessorBeanFactory方法,经常用于新增BeanDenifition。使用时,可以使用new GenericBeanDefinition().setBeanClass(Abc.class),然后用参数中的beanFactory.registerBeanDefinition("beanName", 上一步new的对象)就能注册一个bean

16.6. Aware

感知接口,spring提供的一种机制,通过实现该接口,重写方法,可以感知spring应用程序执行过程中的一些变化,spring会判断当前的Bean有没有实现Aware接口,如果实现了,会在特定的时机回调接口对应的方法。

    • BeanNameAware: Bean名称的感知接口

    • BeanClassLoaderAware: Bean类加载器的感知接口

    • BeanFactoryAware: Bean工厂的感知接口

16.7. InitializingBean

初始化接口,当bean被实例化好后,会回调里面的函数,经常用于一些加载资源的工作,DisposableBean:销毁接口,当bean被销毁之前,会调用里面的函数,经常用于做一些释放资源的工作。@PostConstruct 方法注解,也是初始化一个方法,@PreDestroy 方法注解,也是销毁之前调用的方法,用注解的方法先于实现的覆盖的接口的方法之前执行

@PostConstruct注解的方法在 Bean 的所有属性都被赋值后,且用户自定义的初始化方法之前调用。

//顺序
LifecycleDemoBean: 实例化
LifecycleDemoBean: @PostConstruct(初始化)
LifecycleDemoBean: afterPropertiesSet(InitializingBean)
LifecycleDemoBean: customInit(自定义初始化方法)
获取LifecycleDemoBean实例...
LifecycleDemoBean: @PreDestroy(销毁前)
LifecycleDemoBean: destroy(DisposableBean)
LifecycleDemoBean: customDestroy(自定义销毁方法)

16.8. BeanPostProcessor

Bean的后置处理器,当Bean对象初始化之前以及初始化之后,会回调该接口对应的方法。postProcessorBeforeInitialization: bean对象初始化之前调用,postProcessorAfterInitialization:bean对象初始化之后调用


粤ICP备16076548号
发表评论