今天要了解的注解是SpringBoot底层中大量使用的@Import注解和@Conditional及其派生注解。
我们启动SpringBoot项目的时候,IOC容器中会自动填充各样的Bean,就是因为@Import注解和@Conditional及其派生注解将Bean加载到容器中去了。
我们可以发现有的Bean是全限定名,有的Bean就是方法名。
这是为什么呢??????????????????????
这就跟@Import注解和@Conditional注解有关了。
我们创建三个类,一个Cat类,一个Mouse类,一个Configurer类。
分别将Cat类和Mouse类打上@Component注解,将他们都注入Spring容器中。
发现两个类都正常注入进来了,而且都是类名小写。
我们换一种方式来注入两个类,使用Configurer类来注入。
我们来使用@Import注解。
注意Configurer类一定要被Spring容器所管理,不然@Import是无法注入进去的。
我们可以发现,Cat类和Mouse类是以全限定名的方式成功注入进来了。
我们还可以给Bean取个别名。
注入的Bean就按照我们取的名字注入进来。
使用构造器的注入。
使用构造器加取别名。
下面我们看看使用@Conditional注解及其派生注解。
我们直接先使用@ConditionalOnClass注解看看,这个注解的意思是当有什么类时就加载此类。
我们会发现只有Mouse类被加载进来了,这是骗我们吗?
其实不是的,这是因为我们Cat类没有被Spring容器管理。我们换成@ConditionalOnMissingBean可以发现端倪。
@ConditionalOnMissingBean注解的意思是在缺少什么Bean时才加载这个类。
我们可以发现,即使Cat类被Spring容器所管理,但是任然没有加载出来,所以这个注解其实是起了作用的。
我们在Configurer类中来试验一下。
我们可以看到Cat类是没有被加载出来的。
但是我们换一种方式
这样我们会发现Cat类被加载出来了,这是与加载顺序有关,我们将这两个加载位置换一下。
我们再换一个方式
在Cat类中使用@Import和@ConditionalOnMissingBean注解,我们会发现Cat类和Mouse类都注入容器中了。
这个情况是和注解的生效时间有关,@ConditionalOnMissBean注解先发挥作用,发现Mouse类没有注入到Spring容器,就加载了Cat类,后面@Import注解发挥作用,将Mouse类加入了Spring容器,所以我们就看到了Cat类和Mouse类都被Spring容器加载了。
说了这么多核心思想就一句话,我们使用时要注意加载的顺序去使用这些注解不然可以会发生不符合我们自己预期的结果。