page contents

关于aop失效的问题

Pack 发布于 2020-02-22 19:04
阅读 480
收藏 0
分类:Java开发

有一个切面

@Component
@Aspect
public class SmartRuPermissionAop {

	/**
	 *
	 */
	@Pointcut(value = "execution(* com.shuncom.api.controller.core.led..*.*(..) )&&" +
			"@annotation(com.shuncom.unicom.aop.annotation.SmartRuPermission)")
	public void aspect() {
	}

	/**
	 * 环绕通知
	 *
	 * @param joinPoint
	 * @throws Throwable
	 */
	@Around("aspect()")
	public void around(JoinPoint joinPoint) throws Throwable {
		User sessionUser = SessionUtil.getUser();
		if (sessionUser == null) {
			throw new ServiceException("session_time_out");
		}
		((ProceedingJoinPoint) joinPoint).proceed();
	}

}


匹配的是controller类下的所有方法以及使用了注解SmartRuPermission的所有方法
现在我的controller类代码如下

@Controller
@RequestMapping("/led")
public class LedController1_0 implements DD {


	@Override
	@SmartRuPermission
	public void dd() {

	}

	@SmartRuPermission
	public void xx() {

	}
}

DD接口如下

public interface DD {
	public void dd();
}

上述代码实际上的结果,只能匹配到dd()方法,也就是实现了接口DD的方法,但是另外一个xx()方法缺不能被aop拦截到
这里就很费解,不知道大家怎么看待这个问题的呢

427
Pack
Pack

原因:AOP动态代理实现由两种:JDK的动态代理和CGLIB代理

1.JDK的动态代理只代理接口中的方法

2.CGLIB动态代理可以代理类中的方法

Spring AOP动态代理默认实现的逻辑是判断类是否有接口,有接口的话会使用JDK的动态代理,其他的话是CGLIB代理


解决办法:

1.在接口中也添加public void xx()

2.类删除implements DD(这个方法在此处不太适用)

3.使用@EnableAspectJAutoProxy强制采用CGLIB代理(proxyTargetClass = true)>

请先 登录 后评论