AOP的实现(基于代理类或AspectJ)
AOP的底层都是基于动态代理的,底层无非是JDK动态代理或者CGLIB动态代理。而AOP的具体实现也同样的有两种方式,一种底层的基于代理类的,而另一种是基于代理类封装得来的AspectJ。前边我们已经说过了JDK和AspectJ这两种动态代理的区别。而在AOP得具体实现中我们只讲一下AspectJ中基于注解的声明式AspectJ开发。
-
使用基于注解的AspectJ开发需要在spring的配置文件中开启注解扫描,和启动基于注解的声明式AspectJ支持
<!--指定需要扫描的包,扫描注解,使注解生效(这里扫描到的是speing核心包里的注解,当然包括AOP的注解,但不包括spring mvc,jpa的注解)--> <context:component-scan base-package="com.xinke"/> <!--启动基与注解的声明式AspectJ支持--> <aop:aspectj-autoproxy />
-
在目标类(UserDaoImpl)上添加注解@Repository(“UserDao”),以便在测试类中使用:UserDao userDao = (userDao) applicationContext.getBean(“UserDao”);得到代理对象。使用注解来定义切面类(不用再写代理类来调用切面类中的方法了)
@Aspect
@Component
public class MyAspect{
//定义切入点表达式,表示jdk包下的任何类的任何方法,包含任意参数
@Pointcut("execution(* com.xinke.jdk.*.*(..))")
//使用一个返回值为void,方法体为空的方法来命名切入点
private void myPointCut(){}
//前置通知
@Before("myPointCut()")
public void myBefore(JointPoint jointPoint){
...
}
//后置通知
@AfterReturning('myPointCut()')
//环绕通知
@Around("myPointCut()")
//异常通知
@AfterThrowing(value="myPointCut()",throwing="e")
//最终通知
@After("myPointCut()")
}