spring扩展

spring扩展

起男 1,235 2020-08-28

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:对响应结果进行处理