大家好,我是码农小胖哥,刚刚忙完,但是今天的干货分享还是少不了的。没有关注的点下关注,给个赞鼓励一下。这也是我持续分享的动力。
在springboot中,有很多组件直接集成就起了作用,有的甚至没有一行配置,组件的特性就能直接拿来用。如果换SSM之类的框架,可能要写不少配置。今天就将一种骚操作。自动配置的机制之一 EnableAutoConfiguration。 上面的情形相信用过springboot的都遇到过。我开始也感到很神奇,于是就看了源码,找了很多地方都没找到这种配置的机制。偶尔一次我注意到很多starter 里有这种东西
有点配置文件的感觉,而且key 是一个注解 @EnableAutoConfiguration 的全路径。顺藤摸瓜找到一个叫 SpringFactoriesLoader 的工具类。
如图所示,清楚写着资源路径 "META-INF/spring.factories" , 说明上面的那个配置文件就是 为这个类准备的。该类有两个方法
这个类从注释上知道是通过 配置文件 key 所声明的类来获取 所有对应值的类的实例列表。
第二个 是加载给定类型的实现类的完全限定名的集合。
到这里我们就可以猜想一下,在这里声明了之后,就可以写实例化的逻辑,然后注入了配置,实现了自动化配置,而且可插拔。然后根据这个猜想 我们从来搞一下。
在springboot资源包下新建了 META-INF/spring.factories ,内容照葫芦画瓢 为
第一个测试自动配置 第二个 测试SpringFactoriesLoader 两个方法的作用。既然自动化配置。当然应该可以从外部加载。所以我声明了一个在springboot main类路径之外的一个测试自动化配置类。我们都知道 springboot 启动的时候会自动扫描 main类路径以内的所有包的 spring bean。
这个javaConfig 我什么注解也没有在类上添加,以往的普通操作都是要加一些@Configuration 之类的注解。现在我只加了 日志的 lombok类,来打印日志。
如果这个javaConfig 生效 应该形成两个 spring bean。启动项目后 借助
spring-boot-starter-actutor 这个工具和IDEA我们可以看到
这是个开发小技巧,借助于上面的工具我们可以在IDEA可视化工具看到所有的spring bean,根据上图说明配置自动生效了。同时发现 Selector 也通过配置实例化了。我们在看看打印结果
第一行打印出来的 是 SpringFactoriesLoader 的loadFactories 方法 实例化了 接口对应的实现类,第二行是第二个方法loadFactoryNames 获取到了实现类的全限定名。这样的作用就很清楚了,以后有机会你就可以用SpringFactoriesLoader搞事情了。 这种机制有点像java 的SPI接口机制 同样是声明了一个文件来获取实现类。有时间可以自己学习下java 的SPI。dubbo,slf4j, 数据库驱动,apache camel 都用了大量的 java SPI。 上面的写法你可以独立写一个项目,作为依赖引入springboot 看看生效不生效。自己动手搞一下,多动手才能有进步。
通过上面的介绍和演示,你脑海中是不是有了新的骚操作呢?有请留言告诉我。我是 码农小胖哥 关注我 有更多干货奉上。别忘记点个赞哦。