JDK
在这里插入代码片 public static void main(String[] args) {
//目标对象
final Target target = new Target();
//增强对象
Advice advice = new Advice();
//返回值就是动态生成的代理对象
TargetInterface proxy = (TargetInterface) Proxy.newProxyInstance(
target.getClass().getClassLoader(), //目标对象的类加载器
target.getClass().getInterfaces(),//目标对象相同的接口字节码对象数组
new InvocationHandler() {
//调用代理对象的任何方法时,实际执行的都是invoke方法
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
advice.before(); //前置增强
method.invoke(target,args); //执行目标方法
advice.afterReturn();
return null;
}
}
);
//调用代理对象的方法
proxy.save();
}
cglib
public static void main(String[] args) {
//目标对象
final Target target = new Target();
//增强对象
final Advice advice = new Advice();
//1.创建增强器
Enhancer enhancer = new Enhancer();
//2.设置父类(目标)
enhancer.setSuperclass(target.getClass());
//3.设置回调
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
advice.before();
method.invoke(target, args);
advice.afterReturn();
return null;
}
});
//4.生成代理对象
Target target1 = (Target) enhancer.create();
target1.save();
}
AOP概念
Target 目标对象 : 需要被增强的对象。
Proxy 代理 : 被AOP增强后产生的代理类。
Joinpoint连接点:指可以被增强的方法。
Pointcut切入点:指实际操作中要被增强 的方法。
Advice 增强/通知 :指要在切入点中增强的方法。
Aspect 切面 : 指切入点和增强/通知的结合。
Weaving 织入:指增强并创建代理对象的过程,spring采用动态代理织入。
aspectj框架,是实现了aop思想的技术,被spring吸纳并推荐使用代替spring自带的aop技术。
jdk的动态代理方式:
目标类实现了接口,使代理类也去实现目标接口,所以代理类和目标类是兄弟关系。
cglib:
设置目标类为代理类的父类,所以目标类和代理类是父子关系。
如果目标类实现了接口就会使用jdk动态代理,如果没有实现接口就使用cglib。