spring 集成 小结

Spring 集成场景

Spring 作为业界比较常用的 ioc 容器,新的框架,为了更好的在spring 项目中使用,基本都要集成到spring中,spring提供了很多种集成方案,本文将简单总结一下spring 集成的方案和需要注意的问题。

ImportBeanDefinitionRegistrar/BeanDefinitionRegistryPostProcessor and @Import 参考链接

手动注册bean的两种方式:
1.实现ImportBeanDefinitionRegistrar (主要在invokeBeanFactoryPostProcessors时基于ConfigurationClassPostProcessor(BeanDefinitionRegistryPostProcessor) ->ConfigurationClassParser实现)
2.实现BeanDefinitionRegistryPostProcessor
一般都会和 @Import 结合使用。
注:BeanDefinitionRegistryPostProcessor 优先于BeanFactoryPostProcessor 执行

@Import注解就是之前xml配置中的import标签,可以用于依赖第三方包中bean的配置和加载
在4.2之前只支持导入配置类
在4.2,@Import注解支持导入普通的java类,并将其声明成一个bean
可以结合ImportSelector一起使用
当然也可以自己显示的 添加到spring bean, 不过一般作为框架底层都会基于自定义的注解类,直接隐式注入
(注意:ImportBeanDefinitionRegistrar只能通过由其它类import的方式来加载,通常是主启动类类或者注解。)
如下:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Import(WConfigRegister.class) // WConfigRegister 实现 ImportBeanDefinitionRegistrar
public @interface EnableWconfig

BeanFactoryPostProcessor

BeanFactoryPostProcessor 是Spring初始化bean时对外暴露的扩展点。 IoC容器允许BeanFactoryPostProcessor在容器实例化任何bean之前读取bean的定义(配置元数据),并可以修改它。同时可以定义多个BeanFactoryPostProcessor,通过设置’order’属性来确定各个BeanFactoryPostProcessor执行顺序。postProcessorBeanFactory方法执行顺序先于BeanPostProcessor接口中方法。

在Spring中内置了一些BeanFactoryPostProcessor实现类:

org.springframework.beans.factory.config.PropertyPlaceholderConfigurer
org.springframework.beans.factory.config.PropertyOverrideConfigurer
org.springframework.beans.factory.config.CustomEditorConfigurer:用来注册自定义的属性编辑器

BeanPostProcessor

在这里插入图片描述
Spring容器通过BeanPostProcessor给了我们一个机会对Spring管理的bean进行再加工。BeanPostProcessor接口有两个回调方法。当一个BeanPostProcessor的实现类注册到Spring IOC容器后,对于该Spring IOC容器所创建的每个bean实例在初始化方法(如afterPropertiesSet和任意已声明的init方法)调用前,将会调用BeanPostProcessor中的postProcessBeforeInitialization方法,而在bean实例初始化方法调用完成后,则会调用BeanPostProcessor中的postProcessAfterInitialization方法,整个调用顺序如上图所示。
注意:
1.BeanFactory和ApplicationContext两个容器对待bean的后置处理器稍微有些不同。ApplicationContext容器会自动检测Spring配置文件中那些bean所对应的Java类实现了BeanPostProcessor
接口,并自动把它们注册为后置处理器。在创建bean过程中调用它们,所以部署一个后置处理器跟普通的bean没有什么太大区别。
2.BeanFactory容器注册bean后置处理器时必须通过代码显示的注册,在IoC容器继承体系中的ConfigurableBeanFactory接口中定义了注册方法

InstantiationAwareBeanPostProcessor

InstantiationAwareBeanPostProcessor接口继承BeanPostProcessor接口。InstantiationAwareBeanPostProcessor代表了Spring的另外一段生命周期:实例化。先区别一下Spring Bean的实例化和初始化两个阶段的主要作用:

1、实例化—-实例化的过程是一个创建Bean的过程,即调用Bean的构造函数,单例的Bean放入单例池中

2、初始化—-初始化的过程是一个赋值的过程,即调用Bean的setter,设置Bean的属性

之前的BeanPostProcessor作用于过程(2)前后,现在的InstantiationAwareBeanPostProcessor则作用于过程(1)前后;

各种 Aware

aware 的这些接口的存在,让我们可以获取、修改beanName(getBeanName)、事件发布(applicationContext.publishEvent)等。为实现 功能拓展,可以集成 相应的 Aware 获取spring生命周期的一些对象。
spring aware 以下是几个常用的接口:

1、ApplicationContextAware 能获取Application Context调用容器的服务

2、BeanNameAware 提供对BeanName进行操作

3、ApplicationEventPublisherAware 主要用于事件的发布

4、BeanClassLoadAware 相关的类加载器

5、BeanFactoryAware 声明BeanFactory的
6、EnvironmentAware 获取配置
7、ResourceLoaderAware 获取Resource

Order && PriorityOrdered

用来 控制多个 相同职能的bean 的执行顺序。
OrderComparator比较器进行排序的时候:

  • 若2个对象中有一个对象实现了PriorityOrdered接口,那么这个对象的优先级更高。
  • 若2个对象都是PriorityOrdered或Ordered接口的实现类,那么比较Ordered接口的getOrder方法得到order值,值越低,优先级越高。

ApplicationContextInitializer

ApplicationContextInitializer接口是spring上下文初始化的回调函数在上下文(ConfigurableApplicationContext)刷新(refresh)之前调用。允许我们对ConfigurableApplicationContext的实例做进一步的设置或者处理。
支持三种方式扩展:

  • 基于 /META-INF/spring.factories 文件 (通用扩展一般使用这种,不需要显示添加)
  • application.properties 设置 context.initializer.classes (for springboot)
  • 显示调用 springApplication.addInitializer (for springboot)

EnableAutoConfiguration

实现 springboot 自动配置,结合/META-INF/spring.factories 实现。直接基于配置文件,实现类似DataSorce 等通用配置的 bean 自动创建。方便开发快速接入。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.chapa.architx.spring.wconfig.sprintboot.WconfigAutoConfiguration
org.springframework.context.ApplicationContextInitializer=\
com.chapa.architx.spring.wconfig.sprintboot.WconfigApplicationContextInitializer

注意:一般会结合 ConditionalOnClass 使用,有些第三方框架会使用 class.getAnnotations,该方法会加载 里面置顶的 class ,可能会导致 classnotfound 错误。

NamespaceHandlerSupport (XML自定义扩展)

实现 xml 配置的 自定义标签解析。结合 registerBeanDefinitionParser 实现解析器。为了让Spring在解析xml的时候能够感知到我们的自定义元素,我们需要把namespaceHandler和xsd文件放到2个指定的配置文件中,这2个文件都位于META-INF目录下

spring.handlers
http\://www.chapa.architx.com/schema/wconfig=com.chapa.architx.spring.wconfig.NamespaceHandler
spring.schemas
http\://www.chapa.architx.com/schema/wconfig/wconfig-1.0.0.xsd=/META-INF/wconfig-1.0.0.xsd
http\://www.chapa.architx.com/schema/wconfig/wconfig.xsd=/META-INF/wconfig-1.0.0.xsd
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值