首先,大家思考一个问题:
在开发中,我们经常在Controller中注入Service方法,完成业务处理;有没有试过在Service中注入Controller方法?这样注入会不会有问题?
按照我以前的理解就是:Spring上下文管理的是由@Service,@Respository和@Component这三个注解标识的bean;SpringMVC上下文管理的就是由@Controller标识的bean,然后继承Spring上下文;
基于以上理解,我就认为:Spring和SpringMVC在解析@Controller,@Service,@Respository这三个注解的时候,肯定对应不同的注解有不同的处理逻辑,要不然怎么区分将@Controller标识的bean加到SpringMVC容器而不是Spring容器的呢?
带着这个问题,我就去看了Spring进行包扫描后,解析注解的源码:发现处理逻辑都是一样的,没有针对不同的注解进行不同的处理。 Spring的处理逻辑是,只要bean上有@Component注解,就会将bean加入到容器管理中。(@Controller,@Service和@Respository这三个注解都被@Component标识了的,这三个注解只是语义上的不同,对于spring来说都一样),大家对spring解析注解源码有兴趣的,可以参考这个博客。
既然处理逻辑都一样,那是怎么将由不同注解标识的bean放到不同的容器中的呢?
答案就是:在配置包扫描路径的时候,Spring排除掉controller所在的包,SpringMVC只配置Controller所在的包。
也即是这么配置:
Spring: applicationContext.xml
<context:component-scan base-package="com.test"> <!-- base-package 指定扫描的包路径 -->
<context:exclude-filter ty