ApplicationContextInitializer
spring容器在刷新之前初始化ConfigurableApplicationContext的回调接口
用户可以在spring容器初始化之前做一些事
方法:
- initialize:在容器刷新之前调用此方法
注:由于调用此方法时spring还未初始化,所有要生效需要:
在启动类中用通过SpringApplication对象的addInitializers()方法添加
在配置文件中添加context.initializer.classes=实现类全路径
用spi方式:在resources中创建META-INF/spring.factories,并加入
org.springframework.context.AppliccationContextInitializer=实现类全路径
BeanDefinitionRegistryPostProcessor
这个接口在读取项目中的beanDefinition之后执行,提供一个补充的扩展点
可以自己在这里动态注册自己的beanDefintion,可以加载classpath之外的bean
方法:
- postProcessBeanDefinitionRegistry:用来注册更多bean到spring容器中
- postProcessBeanFatory:主要用来对bean定义做出改变
BeanFactoryPostProcessor
这个接口是beanFactory的扩展接口
可以通过实现此接口自己实现一些东西,比如修改已经注册的beanDefinition信息
方法:
- postProcessBeanFactory:在spring读取beanDefinition信息之后,实例化bean之前执行
InstantiationAwareBeanPostProcesssor
该接口继承了BeanPostProcess接口
BeanPostProcess接口只在bean的初始化阶段进行扩展。而OmstamtoatopmAwareBeanPostProcessor接口在此基础上增加了3个方法,把可扩展的范围增加了实例化和属性注入阶段
方法:
- postProcessBeforeInstantiation:实例化bean之前,相当于new这个bean之前
- postProcessAfterInstantiation:实例化bean之后,相当于new这个bean之后
- postProcessPropertyValues:bean已经实例化完成,在属性注入时触发,@Autowired、@Resource等注解原理基于此方法实现
- postProcessBeforeInitialization:初始化bean之前,相当于把bean注入spring上下文之前
- postProcessAfterInitialization:初始化bean之后,相当于把bean注入spring上下文之后
SmartInstantiationAwareBeanPostProcessor
方法:
- predictBeanType:该节点发生在postProcessBeforeInstantiation之前,这个方法用于预测bean的类型,返回第一个预测成功的Class类型,如果不能预测返回null;当你调用BeanFactory.getType(name)时通过bean的名称无法得到bean类型信息时就调用该回调方法来决定类型信息
- determineCandidateConstructors:该触发点发生在postProcessBeforeInstantiation之后,用于确定bean的构造函数,返回的是该bean的所有构造函数列表。用户可以扩展这个点,来自定义选择相应的的构造器来实例化这个bean
- getEarlyBeanReference:该触发点发生在postProcessBeforeInstantiation之后,当有循环依赖的场景,当bean实例好之后,为了防止循环依赖,会提前暴露回调方法,用于bean实例化的后置处理。这个方法就是在提前暴露的回调方法中触发
BeanFactoryAware
可以在bean实例化之后,但还未初始化之前,拿到BeanFactory,在这个时候,可以对每个bean做特殊的定制化,或缓存BeanFactory
方法:
- setBeanFactory:在bean实例化之后,属性注入之前。可以通过参数后期BeanFactory对象
ApplicationContextAwareProcessor
实现了BeanPostProcessor接口
该类本身并没有扩展点,但是该类内部却有6个扩展点可共实现
扩展点:
- EnvironmentAware:用于获取Enviroment的一个扩展类,这个变量非常有用,可以获得系统内的所有参数
- EmbeddedValueResolverAware:用于获取StringValueResolver的一个扩展类,StringValueResolver用于获取基于String类型的properties的变量,一般我们都用@Value的方式去获取,如果实现了这个接口,把StringValueResolver缓存起来,通过这个类获取String类型的变量效果是一样的
- ResourceLoaderAware:用于获取ResourceLoader的一个扩展类,ResourceLoader可以用于获取classpath内所有的资源对象,可以扩展此类拿到ResourceLoader对象
- ApplicationEventPublisherAware:用于获取ApplicationEventPublisher的一个扩展类,ApplicationEventPublisher可以用来发布事件,结合ApplicationListener来共同使用
- MessageSourceAware:用于获取MessageSource的一个扩展类,MessageSource主要用来做国际化
- ApplicationContextAware:用来获取ApplicationContext的一个扩展类,ApplicationContext是上下文管理器,可以手动获取任何在spring上下文注册的bean,ApplicationContext实现类BeanFactory,MessageSource,ApplicationEventPublisher等接口
BeanNameAware
这个类是Aware扩展的一种
可以在bean初始化之前拿到bean的名称,并可自行修改
方法:
- setBeanName:触发点在bean初始化之前,也就是InstantiationAwareBeanPostProcesssor的postProcessBeforeInitialzation之前
@PostConstruct
由jsr250提供,顾名思义在构造方法之后执行
这不是一个扩展点,是一个标注,作用是在bean初始化的阶段,如果一个方法标注了这个注解,就会调用这个方法
它的触发时机在InstantiationAwareBeanPostProcesssor的postProcessBeforeInitialzation之后,InitializingBean.afterPropertiesSet之前
@PreDestroy
由jsr250提供,顾名思义在销毁之前执行
InitializingBean
这个接口是用来初始化bean的。
方法:
- afterPropertiesSet:该方法的执行时机在InstantiationAwareBeanPostProcesssor的postProcessAfterInitialization之前
FactoryBean
spring通过反射机制利用bean的class实例化bean,但是某系情况下,实例化bean的过程比较复杂,如果用传统方式,需要大量配置信息,配置灵活性受限,这时采用编码的方式可能得到一个简单的方案,spring提供了这个接口,已实现定制化bean
方法:
- getObject:返回对象的实例
- getObjectType:bean的类型
- isSingleton:是否是单例
SmartInitializingSingleton
可以通过扩展此接口在单例对象初始化完毕后,做一些后置处理
方法:
- afterSingletonsInstantiated:在所有单例对象(非懒加载)初始化完成后调用。触发时机在InstantiationAwareBeanPostProcesssor的postProcessAfterInitialization之后
CommandLineRunner
扩展此接口在项目启动之后处理一些业务
方法:
- run:触发时机是整个项目启动完毕后,自动执行。如果有多个,可以用@Order来进行排序
DisposableBean
方法:
- destroy:触发时机为此对象销毁时,比如说运行applicationContext.registerShutdownHook
ApplicationListener
可以监听某个事件的event,触发时机可以穿插在业务方法执行过程中
主要事件:
- ContextRefreshedEvent:ApplicationContext被初始化或刷新时,发布该事件
- ContextStartedEvent:当使用ConfigurableApplicationContext(ApplicationContext子接口)接口中的start()方法启动ApplicationContext时,该事件发布
- ContextStoppedEvent:当使用ConfigurableApplicationContext接口中的stop()方法停止ApplicationContext时,发布这个事件
- ContextClosedEvent:当使用ConfigurableApplicationContext接口的close()方法关闭ApplicationContext时,发布这个事件
- RequestHandledEvent:这是一个web-specific事件,告诉所有bean,HTTP请求已经被服务。只能应用于DispatcherServlet的web应用。在使用spring作为前端的mv控制器时,当spring吹用户请求结束后,系统会自动触发该事件
ApplicationRunner
和CommandLineRunner接口基本一致,不同之处在于CommandLineRunner接口的run()方法接受String数组作为参数,即是最原始参数,没有任何处理;而ApplicationRunner接口的run方法接受ApplicationArguments对象作为参数,是对原始的进一步封装
HandlerMethodArgmentResolver
springmvc提供,用来对请求参数进行解析处理
方法:
- supportsParameter:判断是否对请求参数处理
- resolveArgument:对请求参数进行处理
ResponseBodyAdvice
springmvc提供,用来对响应结果进行处理
方法:
- supports:判断是否对响应进行处理
- beforeBodyWrite:对响应结果进行处理