Spring父子上下文解析

首先我是在学习SpringCloudAlibaba的时候,学习到了Ribbon配置的时候,需要自定义配置Ribbon的负载均衡规则,那么就需要写一个自定义的配置类了,所以用到了@Configuration注解。因为我是用的是SpringBoot项目作为主框架的,所以在使用@Configuration注解的时候就会与SpringBoot项目启动类上面的@SpringBootApplication注解产生父子上下文问题。接下来我们解析一下:

首先我们可以查看一下@Configuration注解,发现是一个组合注解,其中里面就包含了@Component注解,也就是说@Configuration注解也是一种特殊的Component。

接下来我们再看一下@SpringBootApplication注解,他也是一个组合注解,其中里面也包含了一个@ComponentScan注解,解释一下@ComponentScan注解的作用是用来扫描Component的,也就是说@Component,@Controller,@Service,@Repository等这些Component注解都会被扫描到,包括上面提到的@Configuration注解也会被扫描到。默认扫描的位置是当前启动类所在的包以及启动类包下面的所有Component。

通过上面的描述,Ribbon的配置类一定不能让@SpringBootApplication注解扫描到。这是为什么呢???这就是因为Spring的上下文,是一个树状的上下文。在我们的应用里@SpringBootApplication注解所扫描的上下文叫主上下文,而Ribbon也会有一个上下文,是一个子上下文。那么如果父子上下文所扫描的包重叠,就会出现各种各样奇葩的问题。。。

下面说一下,Spring父子上下文扫描重叠的问题。我们可以通过以前使用的xml配置文件形式了解一下。我是使用Spring+SpringMVC的项目理解的。
首先我会在Spring的applicationContext.xml文件中配置配上下面这段代码:


      

也就是扫描:component的时候把Controller排除掉

而在SpringMVC的dispatcher-servlet.xml配置文件中配置下面这段代码:


      

意思是,mvc只扫描controller。其他的component注解就不扫描

为什么这么配置呢,就是为了方式父子上下文扫描重叠的问题。Spring的applicationContext.xml是主上下文,而SpringMVC的dispatcher-servlet.xml是一个子上下文,如果父子上下文扫描重叠就会导致事务不生效。可以参考文章【Spring+SpringMVC 配置事务管理无效原因及解决方案】进一步学习。

你可能感兴趣的:(Spring父子上下文解析)