Spring 和 Spring MVC 整合 AOP 不起作用的解决方案

第一种解决方案:
Spring MVC和Spring整合的时候,Spring MVC的springmvc.xml文件中配置扫描包,不要包含service的注解,Spring的applicationContext.xml文件中配置扫描包时,不要包含controller的注解,如下所示:

Spring MVC的xml配置(不要包含service的注解):
<context:component-scan base-package="com.insigma">
  <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
</context:component-scan>
Spring MVC启动时的配置文件,包含组件扫描、url映射,让spring MVC不扫描带有@Service注解的类。为什么要这样设置?因为springmvc.xml与applicationContext.xml不是同时加
载,如果不进行这样的设置,那么,spring MVC就会将所有带@Service注解的类都扫描到容器中,等到加载applicationContext.xml的时候,会因为容器中已经存在Service类的对象,使得
cglib将不对Service进行代理,直接导致的结果就是在applicationContext.xml中的事务配置不起作用,发生异常时,无法对数据进行回滚。以上就是原因所在。

同样的在Spring的xml配置如下:
<context:component-scan base-package="com.insigma">           
 <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
扫描包路径,不扫描带有@Controller注解的类。因为这些类已经随容器启动时,在springmvc.xml中扫描过一遍了。
完成以上工作,就ok了。


第二种解决方案:

在配置springmvc.xml和applicationContext.xml的扫描包的时候,尽可能的细粒度的控制,也就是说尽量的精确,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"    
    xmlns:mongo="http://www.springframework.org/schema/data/mongo"  
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans   
            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
            http://www.springframework.org/schema/data/mongo  
            http://www.springframework.org/schema/data/mongo/spring-mongo.xsd
            http://www.springframework.org/schema/context  
     	http://www.springframework.org/schema/context/spring-context-3.0.xsd
     	http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">  



	<context:component-scan base-package="com.npf.service,com.npf.dao,com.npf.aspect"/>
	
	
	<aop:config>
		<aop:pointcut expression="execution(* com.npf.service.impl..*(..))" id="servicePointcut"/>
	
		<aop:aspect ref="appAspect">
			<aop:before pointcut-ref="servicePointcut" method="checkEntitlement"/>	
		</aop:aspect>
		
		<aop:aspect ref="appAspect">
			<aop:after pointcut-ref="servicePointcut" method="auditLog"/>		
		</aop:aspect>
	</aop:config>


</beans>

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">



	<context:component-scan base-package="com.npf.controller"/>
	
	<mvc:annotation-driven/>
	
	<mvc:resources location="/resources/" mapping="/resources/**"/>

	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix">
			<value>/WEB-INF/jsp/</value>
		</property>
		<property name="suffix">
			<value>.jsp</value>
		</property>
	</bean>


</beans>

你可能感兴趣的:(Spring 和 Spring MVC 整合 AOP 不起作用的解决方案)