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的使用与配置是很简单的,但是实际应用中与其他技术进行配合就会有冲突,对照书上发现自己写的一点不差,却就是不生效,最好还是能够深入框架源码才能找到问题。


Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐