spring 注解aop不生效
2017年06月28日 09:50:58
阅读数:5639
首先基础要理解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" 属于动态代理的方式选择,有兴趣的朋友可以看看其他资料