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
ScannedGenericBeanDefinition类主要用来处理@Component, @Controller, @Service, @Respository, @Configuration, ConfigurationClassBeanDefinition类主要用来处理@Bean
获取某个bean的beanDefinition,可以用context.getBeanFactory().getBeanDefinition("beanName")
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对象初始化之后调用
发表评论