SpringMVC 注解aop不生效

首先基础要理解spring配置文件和springmvc配置文件

spring注解不生效可从以下几个方面找原因

1 springmvc的配置文件中只配置扫描@Controller的注解,spring的配置文件扫描除了@Controller的注解的其他的注解

2 检查@Pointcut 的表达式是否正确

3 如果在service层aop 可以生效,controller层不生效,把  <aop:aspectj-autoproxy proxy-target-class="true"/>添加到到springmvc的配置文件中

附上aop 注解代码

@Component
@Aspect
public class LoginAspect {
	private Logger logger=LoggerFactory.getLogger(LoginAspect.class);
	public LoginAspect(){
	}
	@Pointcut("execution(* com.zyc.service..*.*(..))")
	public void point(){}
	@Pointcut("execution(* com.zyc.controller.*.*(..))")
	public void pointcontroller(){}
	
	/**
	 * 配置环绕通知
	 * @param joinPoint
	 * @return
	 * @throws Throwable 
	 */
	@Around("pointcontroller()")
	public Object aroundMethod(ProceedingJoinPoint joinPoint) throws Throwable{
		logger.debug("进入aoparound方法");
		if(checkPass(joinPoint.getSignature().getName())){
				return joinPoint.proceed();
		}
		HttpServletRequest request=getHttpServletRequest();
		String account=request.getParameter("account");
		logger.debug(account);
		return joinPoint.proceed();
	}
	/**
	 * 检查是否需要验证登录
	 * @param method
	 * @return
	 */
	private boolean checkPass(String method){
		switch(method){
		case "login":
			return true;
		case "register":
			return true;
		}
		return false;
	}
	/**
	 * 获取request
	 * @return
	 */
	protected HttpServletRequest getHttpServletRequest(){
		return ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
	}
}

springmvc配置文件中主要配置

<aop:aspectj-autoproxy proxy-target-class="true"/>
 
    <!-- 扫描controller, 如果全部扫描所有注解可能会导致springmvc映射不管用或者事物失效-->
    <context:component-scan base-package="com.zyc.controller"
        use-default-filters="false">
        <context:include-filter type="annotation"
            expression="org.springframework.stereotype.Controller" />
    </context:component-scan>

spring配置文件中主要配置

<!-- 不扫描controller注解,不然会导致事物失效 -->
  <context:component-scan base-package="com.zyc">
       <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
  </context:component-scan> 
  <aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>

在以上配置中

proxy-target-class="true" 属于动态代理的方式选择,有兴趣的朋友可以看看其他资料

猜你喜欢

转载自blog.csdn.net/pange1991/article/details/81293263