前言
关于SpringBoot的自动装配一直有点疑问,写一篇博客记录一下
使用条件注解
以下是代码的结构和配置类的信息,SpringBoot启动的时候,会默认扫描同包的类和子包的类。 所以我们的配置类会被加载,在配置类中写了一个注解ConditionalOnBean,它的意思是当我们ioc容器中有user这个bean实例的时候,创建User这个类,并放到ioc容器中,但是容器中还没创建过这个类,所以会报错。
当启动主程序的时候,报错了。说没有User这个bean,说明没有注册到IOC容器中。
ConditionalOnProperty结合配置文件
@ConditionalOnProperty(value = “user.enable”),当使用该注解时,需在配置文件中指定user.enable=true,该条件才会生效。如果需要指定其他值的时候,@ConditionalOnProperty(value = “user.enable”,havingValue = “”),havingValue为具体需要的值。
自定义自动配置类和注册
现在有两个隔离的模块demo,demo1,如果需要在demo1中使用demo模块中的类。并且demo中的类已经进行了相关的配置。该怎么做呢?
如果直接引入过来,获取User bean对象的时候,会直接报错,即使在User上加Compoent注解,还是会报错。因为 SpringBoot启动的时候,会默认扫描同包的类和子包的类。 他们所在的包不一样,所以扫描不到。
现在给出一个场景,我们使用一些第三方工具的时候,直接@Autowired自动注入就可以直接使用了,第三方的包结构和我们开发代码的包结构不一样,那么第三方的类是怎么自动注入到IOC容器的呢?
假如demo是第三方写的代码,我们需要在demo1模块终自动注入User类,就需要自定义配置了。配置文件还是不变,可以在配置文件中做各种配置。然后在META-INF/spring.factories文件中注册你的自动配置类,以便Spring Boot能够找到并加载它。
这样demo1启动的时候就不会报错了,第三方自动配置也是这种做的,只是在配置文件中配置的东西更复杂。