1,AOP使用场景
面向对象编程(OOP)是从静态角度考虑程序结构,面向切面编程(AOP)是从动态角度考虑程序执行过程。 经常通过 AOP 来处理一些具有横切性质的系统性服务,如事物管理、安全检查、缓存、对象池管理等,AOP 已经成为一种很经常使用的解决方式。
1)优点
不修改原代码,就可以在主干功能里面添加新功能。
2,实现
AspectJ不是Spring组成部分,是独立的AOP框架,一般把AspectJ和Spring框架一起使用进行AOP操作。 可以通过xml或者注解方式来实现,下面介绍常用注解。
1)切面类
加上@Aspect、@Component注解;
通过添加@Order(数字),设定增强类的优先级。数字越小优先级越高,从0开始。
2)切入点
切入点表达式:
execution([权限修饰符(public或者protected *表示都可以)][返回类型(可以省略)][类全路径(包名)][方法名称]([参数列表(可以用两个点省略)]))
execution(* com.luo.test.User.add(..))
execution(* com.luo.test.User.*(..))
execution(* com.luo.test.*(..))
使用&&、||、!、三种运算符来组合切点表达式,表示与或非的关系。
公共切入点抽取:
@Pointcut(value="切入点表达式")
public void pointDemo(){}
@Before(value="pointDemo()")
3)切入点增强处理
@Before 在切点方法之前执行 @After 在切点方法之后执行 @AfterReturning 切点方法返回后执行(发生异常就不会执行) @AfterThrowing 切点方法抛异常执行 @Around 属于环绕增强,能控制切点执行前,执行后
JoinPoint :方法中的参数JoinPoint为连接点对象,它可以获取当前切入的方法的参数、代理类等信息,因此可以记录一些信息,验证一些信息等;
Object aThis = joinPoint.getThis();
Object target = joinPoint.getTarget();
3,底层原理
动态代理。 有接口的情况下:JDK动态代理; 没有接口的情况下:CGLIB动态代理。
|