Spring的一些常见扩展点

整理一些spring常用的扩展点,相同章节的方法按执行顺序排列。
持续更新中…

1 spring-beans常见扩展点

1.1 Bean实例化[createBeanInstance()]

InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation(): 实例化前调用,可以在这里修改BeanDefinition。如果这里返回不为空,会直接略过后续的bean创建过程,将返回结果当作此次创建的bean。[代码位置:createBean/resolveBeforeInstantiation]
bean实例化 [代码位置:createBeanInstance()]

1.2 Bean的属性注入[populateBean()]

InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation(): 在属性设置前来改变bean的最后机会。返回值为是否继续填充bean。
InstantiationAwareBeanPostProcessor.postProcessPropertyValues(): 在属性获取完、属性填充前对属性的再次处理,典型应用是RequiredAnnotationBeanPostProcessor 中对属性的验证。
[调用位置:populateBean()]
bean属性注入 [代码位置:applyPropertyValues()]

1.3 Bean初始化[initializeBean()]

BeanNameAware.setBeanName():获取 Bean 的名称
BeanClassLoaderAware.setBeanClassLoader():获取 Bean 的classLoader
BeanFactoryAware.setBeanFactory(): 获取beanFactory
BeanPostProcessor.postProcessBeforeInitialization(): 实例化之前的回调
InitializingBean.afterPropertiesSet(): 所有的属性被初始化后、在init-method之前调用。
自定义的init-method
BeanPostProcessor.postProcessAfterInitialization(): 实例化之后的回调

1.4 Bean的销毁

DisposableBean.destory()
自定义的destory-method

1.5 其他

PropertyEditorRegistrar:可注册自定义的属性编辑器,让spring可以按自定义方式解析某些类型的属性。spring在initBeanWrapper()的时候会调用PropertyEditorRegistrar.registerCustomEditors(),之后在属性填充的环节就可以用自定义编辑器进行解析了。

2 spring-boot常见扩展点

2.1 refreshContext之前的扩展

SpringApplicationRunListener.starting(): SpringBoot启动时立马启动,在Spring启动流程中接收不同执行点事件通知的监听者 (应用中使用较少)
ApplicationContextInitializer.initialize(): 该回调接口用于在spring容器刷新[AbstractApplicationContext.refresh()]之前初始化Spring ConfigurableApplicationContext。通常用于需要对应用程序上下文进行编程初始化的web应用程序中。

2.2 refreshContext中的扩展

BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry() : 可动态注册Bean
BeanDefinitionRegistryPostProcessor.postProcessBeanFactory()
BeanFactoryPostProcessor.postProcessBeanFactory(): 在spring容器实际实例化任何其他bean之前读取配置元数据,并可能修改他。建议实现时考虑实现Ordered接口。
注意:如果想改面实际的bean实例最好使用BeanPostProcessor; BeanFactoryPostProcessor的作用域是容器级的,他不会对另一容器中的bean进行后置处理。典型应用是PropertyPlaceholderConfigurer。
beanFactory.preInstantiateSingletons():除了一些特殊bean,大多数单例bean都是在这里被实例化的

2.3 refreshContext之后的扩展

ApplicationRunner: 项目启动后 CommandLineRunner之前调用
CommandLineRunner: 在SpringBoot应用的Application完全初始化工作之后(这里我们可以认为是 SpringBoot 应用启动类main方法执行完成之前的最后一步)执行; 当前 SpringBoot 应用的 ApplicationContext 中的所有 CommandLinerRunner 都会被加载执行(无论是手动注册还是被自动扫描注册到IoC容器中); 建议 CommandLineRunner 的实现类使用 @Order 进行排序调整(非常有用,需要重点关注)

2.3 springBoot Starter

Starter相当于模块,它能将模块所需的依赖整合起来并对模块内的Bean根据环境( 条件)进行自动配置。使用者只需要依赖相应功能的Starter,无需做过多的配置和依赖,Spring Boot就能自动扫描并加载相应的模块。
详情可以参考:从零开始开发一个Spring Boot Starter

3 spring-context常见扩展点

ApplicationContextAware: 可获取applicationContext
ApplicationListener/ApplicationEvent: 事件监听(很重要)
ApplicationEventMulticaster: 事件派发,管理多个ApplicationListener并向它们发布事件。通常,ApplicationContext 会使用 ApplicationEventMulticaster 作为实际发布事件的委托。
ImportSelector: 在初始化bean工厂时期[invokeBeanFactoryPostProcessors()] 会调用。ImportSelector的导入实现是通过BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry()来实现的。
ImportBeanDefinitionRegistrar: 需要与 @Import 和 @Configuration 共同配合使用。@EnableFeignClients, @EnableDubboConfig 等都是通过ImportBeanDefinitionRegistrar 来动态注入的服务调用类到spring容器里面。
SmartLifecycle/Lifecycle: Lifecycle是Spring中最基础的生命周期接口,该接口定义了容器启动和停止的方法,Lifecycle是容器生命周期级别的。SmartLifecycle是对Lifecycle的一个扩展接口。当需要根据Spring容器的生命周期,来做一些逻辑时,一般会自定义一个类实现SmartLifecycle接口;很少有人会使用Lifecycle。多个SmartLifecycle时,可以使用接口中的getPhase()方法控制回调的顺序。方法返回值越小,越靠前执行start()方法,越靠后执行stop()方法。SmartLifecycle这个接口的isAutoStartup()方法,一定要返回true,容器启动时才会回调SmartLifecycle的start()方法。
ClassPathBeanDefinitionScanner: 可以扫描路径下的类(里面的一些方法可以脱离spring环境独立使用).

4 spring-core常用扩展点:

TypeFilter: 自定义过滤规则接口。可以配置@ComponentScan注解使用。spring-core里常见的AnnotationTypeFilter(类是否有注解修饰) / RegexPatternTypeFilter(类名是否满足正则表达式) / AssignableTypeFilter(类型是否能赋值指定类型) 等都实现了TypeFilter接口。

5 springMVC常用扩展点:

HandlerMapping: 处理请求的映射.依据指定策略来决定一个web请求到HandlerExecutionChain对象的生成。
HandlerInterceptor: 拦截器.可以在一个请求被真正处理之前、请求被处理但还没输出到响应中、请求已经被输出到响应中之后这三个时间点去做任何我们想要做的事情,对应方法: preHandle()/postHandle()/afterCompletion()。实际使用时,除了直接实现HandlerInterceptor,我们也经常直接继承HandlerInterceptorAdapter。
HandlerAdapter:调用具体的方法对用户发来的请求来进行处理
HandlerMethodArgumentResolver: 处理方法参数解释绑定器.调用controller方法之前对方法参数进行解释绑定
Converter: 类型转换器.实现自己的类型的转换
ViewResolver: 将逻辑上的视图名称解析为真正的视图
HandlerExceptionResolver: 异常处理
RequestBodyAdvice: 对RequestBody的内容进行统一处理
ResponseBodyAdvice: 可拦截controller方法返回结果并作进一步处理
@ControllerAdvice / @RestControllerAdvice: Controller的Advice通知, 可搭配@InitBinder / @ModelAttribute / @ExceptionHandler / RequestBodyAdvice / ResponseBodyAdvice 等使用
ExceptionHandler: 经常和@ControllerAdvice一起使用, 可实现全局异常捕获。

6 servlet常用扩展点:

ServletContainerInitializer 容器启动时触发
Listener: 在发生特定事件时触发,比如容器关闭等
ServletContextListener: 监听 ServletContext 对象的生命周期,或者说监听 Web 应用的生命周期。当Servlet 容器启动或终止Web 应用时,会触发ServletContextEvent 事件,该事件由ServletContextListener 来处理。spring-webmvc中的WebApplicationContext就是在ContextLoaderListener初始化和清理的,ContextLoaderListener实现了ServletContextListener。
Filter: 客户端请求时触发
OncePerRequestFilter: spring-web中的这个类实现了Filter接口,它能够确保在一次请求中只通过一次filter,而需要重复的执行。我们可以继承这个类来实现自己的filter,这样我们自定义的filter也能确保一次请求中只通过一次filter。
其他: 在SpringBootApplication上使用@ServletComponentScan注解后,Servlet、Filter、Listener可以直接通过@WebServlet、@WebFilter、@WebListener注解自动注册,无需其他代码。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值