Spring aop 概念
Spring AOP 切点表达式
<aop:aspect ref="aopAdvice">
<!--配置通知的类型:前置操作,并且建立通知的方法和切入点方法的关联的方法和切入点方法的关联 -->
<aop:before method="before" pointcut-ref="pt1"></aop:before>
<!--后置通知: 切入点方法正常执行完毕之后 -->
<aop:after-returning method="afterRetruning" pointcut-ref="pt1" returning="rst"></aop:after-returning>
<!--异常通知: 切入点方法有异常后 -->
<!--<aop:after-throwing method="exceptionLog" pointcut="execution(* com.cherry.service.impl.*.*(..))"></aop:after-throwing>-->
<!--最终通知:都会执行 -->
<aop:after method="after" pointcut-ref="pt1" ></aop:after>
</aop:aspect>
// 对应的advice 方法
public void afterRetruning(Object rst){
System.out.println("方法执行的结果值"+rst);
}
AOP 注解
注解AOP 执行顺序 参考,下面这篇文档 写的很好
AOP 原理
(1)jdk 的动态代理
注意事项 1 对象必须要有实现接口 2. 使用jdk java.lang.reflect.Proxy 类的 newProxyInstance 方法
下面是我写的一个小demo
测试类
package com.cherry.test; import com.cherry.proxy.Invocation.MyInvocation; import com.cherry.proxy.UserService; import com.cherry.proxy.impl.UserServiceImpl; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; public class Test { public static void main(String[] args) { // 创建目标对象 UserService us = new UserServiceImpl(); // jdk 动态代理 ,来实现 代理对象 us,并对他 当中的 add 方法进行增强 InvocationHandler h = new MyInvocation(us); /** * newProxyInstance 方法的三个参数是什么意思 * 1.loader: 类加载器(类的字节码对象获得) 写法是固定的 * 2 interfaces 得到该对象所以实现接口的字节码对象的数组 ,写法固定 * 3.需要一个实现了InvocationHandler接口对象, 这步需要自己动手完成,对目标方法功能的增强就是在这个对象中完成的 * */ // 返回的是代理对象 Object newproxyInstance = Proxy.newProxyInstance(us.getClass().getClassLoader(),us.getClass().getInterfaces(),h); //执行代理对象增强后的方法 UserService proxyU = (UserService) newproxyInstance; proxyU.add(); proxyU.delete(); } }
具体的实现类和他的接口
package com.cherry.proxy.impl; import com.cherry.annotation.TestAop; import com.cherry.proxy.UserService; public class UserServiceImpl implements UserService { @Override public void add() { System.out.println("添加一个人员"); } @Override public void delete() { System.out.println("删除一个人员"); } }
package com.cherry.proxy; import com.cherry.annotation.TestAop; public interface UserService { @TestAop void add(); void delete();
需要自己写的增强方法的类
package com.cherry.proxy; import com.cherry.annotation.TestAop; public interface UserService { @TestAop void add(); void delete(); }
最后再来个自定义注解,这个也就相当于,切点,不加,代理的类,所以方法,都被增强了,方式有很多,大家自己try
package com.cherry.annotation; import java.lang.annotation.*; /** * @authore:wjf * @data 2020/5/6 10:44 * @Description: ***/ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface TestAop { String value() default ""; }
(1)cglib 的动态代理