③. cglib的动态代理
- ①. 目标类
public class Target { public void method() { System.out.println("Target running...."); } }
②. 动态代理代码
Target target = new Target(); //创建目标对象 Enhancer enhancer = new Enhancer(); //创建增强器 enhancer.setSuperclass(Target.class); //设置父类 enhancer.setCallback(new MethodInterceptor() { //设置回调 @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("前置代码增强...."); Object invoke = method.invoke(target, objects); System.out.println("后置代码增强...."); return invoke; } }); Target proxy = (Target) enhancer.create(); //创建代理对象
③. 调用代理对象的方法测试
//测试,当调用接口的任何方法时,代理对象的代码都无序修改 proxy.method();
- ④. JDK代理和cglib代理的区别
- JDK动态代理只能对实现了接口的类生成代理,而不能针对类
- CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法因为是继承,所以该类或方法最好不要声明成final
④. AOP的相关概念
①. Target(目标对象):被增强的对象(这里是UserDaoImpl)
②. Proxy (代理):被应用增强后,产生一个代理对象,是一个代理的对象
③.Joinpoint(连接点):指的是可以被拦截到的点
(增删改查这些方法都可以被增强,这些方法称为是连接点)
④. Pointcut(切入点):指的是真正被拦截到的点
(只想对save方法进行增强(做权限校验),save方法称为是切入点)
⑤. Advice(通知/ 增强):拦截后要做的事情
⑥. Aspect(切面):是切入点和通知(引介)的组合,是一个类
⑦. Weaving(织入):是切入点和通知的组合
@AfterReturning(value="execution(* com.xiaozhi.annotation.*.*(..))") public void afterRetruning(){ System.out.println("后置通知"); }