spring的注解极大的方便了配置bean,将以前繁琐的工作简化,其中使用@Transaction注解进行事务管理更是方便,网上和各种书籍中讲解@Transaction注解使用方法的文章更是数不胜数,可是大都千篇一律,而且只是针对事务进行配置,而实际项目中,整个框架中各个功能模块要配合协作才行。这时就会发现@Transaction注解一旦和其他注解配合使用就会失效。
网上几乎找不到对此问题的解决方法,前几日做一个项目中遇到了此问题,百思不得其解,后来费了很大功夫才在一片文章中找到。
此问题出现的原因就同时使用了spring的自动注解扫描和@Transaction注解。
<context:component-scan />
这句配置使得spring自动扫描@Controller、@Service、@Components、@Required、@Autowired 通常@Transaction写在@Service的方法上,@Transactional要使用代理进行AOP处理,spring在一次性扫描时扫描到@service时,@Transactional的代理还没生成,所以@Transactional注解会失效,解决方法就是如此配置,在spring-mvc.xml中
<context:component-scan use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
意思是只扫描@Controller注解
然后再application.xml中
<context:component-scan >
<context:exclude-filter expression="org.springframework.stereotype.Controller" type="annotation"/>
</context:component-scan>
意思是只扫描除了@Controller的所有注解
当spring解析到application.xml时,@Transactional已经生成了代理。此时在扫描@Service等注解后,@Transactional就会生效了。
在一般的书或者文章中@Transactional的使用与配置是很简单的,但是实际应用中与其他技术进行配合就会有冲突,对照书上发现自己写的一点不差,却就是不生效,最好还是能够深入框架源码才能找到问题。