我們在Spring+SpringMVC+Mybatis的集成開發(fā)中,經(jīng)常會遇到事務(wù)配置不起作用等問題,那么本文就來分析下由于spring和springmvc父子容器關(guān)系導(dǎo)致出現(xiàn)這種問題可能的原因以及解決方式.
首先看下項目結(jié)構(gòu) 若我們在spring-mvc.xml文件中進(jìn)行如下配置,這種方式會成功掃描到controller包下所有帶有@Controller注解的Bean,不會掃描帶有@Service/@Repository注解的Bean,是正確的: 但是如下方式,不僅僅掃描到帶有@Controller注解的Bean,還掃描到帶有@Service、@Repository注解的Bean,可能造成事務(wù)不起作用等問題。 這是因為什么呢?下面我們從spring源碼來進(jìn)行分析.
從以上源碼可看出:掃描時首先通過exclude-filter 進(jìn)行黑名單過濾,然后通過include-filter 進(jìn)行白名單過濾,否則默認(rèn)排除。
若我們在spring-mvc.xml中進(jìn)行如下配置: 則SpringMVC容器不僅僅掃描并注冊帶有@Controller注解的Bean,而且還掃描并注冊了帶有@Component的子注解@Service、@Reposity的Bean。因為use-default-filters默認(rèn)為true。所以如果不需要默認(rèn)的,則use-default-filters=“false”禁用掉。 當(dāng)我們進(jìn)行上面的配置時,SpringMVC容器會把service、dao層的bean重新加載,從而造成新加載的bean覆蓋了老的bean,但事務(wù)的AOP代理沒有配置在spring-mvc.xml配置文件中,造成事務(wù)失效。解決辦法是:在spring-mvc.xml配置文件中的context:component-scan標(biāo)簽中使用use-default-filters=“false”禁用掉默認(rèn)的行為。 |
|