在学习SpringBoot的时候,入了不少的坑。今天学习@SpringBootApplication里面的@EnableAutoConfiguration注解的exclude属性的,加载配置中,发现了属性失效的case
病状:exclude属性不起作用,如下:
根治:首先我们要知道exclude这个属性的使用说明,说明exclude就是说一下这个@EnableAutoConfiguration这个注解了
我们都知道这个注解(@EnableAutoConfiguration)是自动装配我们容器中的bean实例的,他会从你的< classpath >下的类中自动生成一些bean,并且加载到context中.
看重点了,他加载的是classpath下的Bean.我么看一下springboot的源码
看到SpringFactoriesLoader这个类会加载classpath下面的META-INF/spring.factories文件下面的所配置的所有bean
因为SpringBoot是一个全能框架,所以他的扩展方面也是很强的。我们使用springboot的时候必然是用maven.那么如果项目要引用第三方配置,或者classpath的配置。我么通过spring.factories文件就可以实现。下面是一个小case
两个maven项目springboot 是主要的项目。我们springboot这个项目引用dev这个项目里面的某个配置的时候。就需要将两个项目做关联。我们可以在springboot这个项目里面加入dev这个项目的maven坐标,如下:
boot里面引用dev的坐标之后两个项目就有所关联了,现在我们引用dev里面的配置。有两种结果
第一种:如果你的启动类和你引用的配置类在一个包底(包名一样或者在包的子包下)下,那么直接获取是没问题的因为有@ComponentScan这个注解
第二种:就是没在一个包下,@ComponentScan这个注解也没有扫描那个包。我们就可以通过spring.factory来配置。比如在dev这个项目中:如下:
内容是下面的这个截图同样是KEY-VALUE形式的
这里的名字不能更改的,不然不起作用,通过这样配置然后再在springboot中引用dev的配置就可以了。到这里应该就知道为什么exclude这个属性不生效了,因为他们没有在同一个包下面@ComponentScan这个注解做了自动扫描没有扫描到这里面的bean
加载spring.factories文件返回一个spring[]的数组会全部注入到spring ioc容器中。所以exclude这个属性是控制的spring.factories这个文件里面的注入ioc容器的bean...
完()