前言
上一篇文章主要聊聊如何实现一个带有拦截器功能的SPI。今天就来聊聊自定义的SPI如何与spring整合。
思考:我们实现的SPI要整合spring哪些东西?或者我们要利用spring的哪些特性实现我们哪些东西?
spring除了被大家熟知的IOC和AOP之外,还有它也提供了很丰富的扩展点,比如各种后置处理器,今天我们就聊聊大家相对熟悉的话题,如何通过自定义注解把SPI注入到spring容器中
整合思路
1、自定义注解
1 | java复制代码@Documented |
2、自定义bean定义扫描器
1 | java复制代码public class ActivateClassPathBeanDefinitionScanner extends ClassPathBeanDefinitionScanner { |
3、定义ImportBeanDefinitionRegistrar
1 | java复制代码public class SpiRegister implements ImportBeanDefinitionRegistrar, EnvironmentAware { |
4、自定义enabled注解
1 | java复制代码@Target(value = ElementType.TYPE) |
示例演示
1、在需要注入到spring容器的类上加上@Activate注解
1 | java复制代码@Activate("hello-mysql") |
2、启动类上加上扫描SPI范围注解
1 | java复制代码@SpringBootApplication(scanBasePackages = "com.github.lybgeek") |
3、利用getBeansOfType进行验证
1 | java复制代码 applicationContext.getBeansOfType(SpringSqlDialect.class) |
打印结果如下
1 | java复制代码hello-mysql-->com.github.lybgeek.dialect.mysql.SpringMysqlDialect@433348bc |
说明已经注入到spring容器中
总结
把项目的服务托管给spring ioc容器,可以算是与spring整合比较基础的动作,本文演示也是相对基础的一环,spring 强大的地方,在于它的扩展性,在spring bean的生命周期中,基本上随处可见扩展点,感兴趣的朋友后续可以自行体会验证
demo链接
本文转载自: 掘金