当前位置 : 主页 > 编程语言 > java >

Spring-AOP动态代理技术(底层代码)

来源:互联网 收集:自由互联 发布时间:2022-07-13
1.JDK代理:基于接口的动态代理技术 目标对象必须有接口,目标对象有什么方法,目标接口就有什么方法, 运行期间基于接口动态生成代理对象,所以代理对象也就有目标对象同样的方


1.JDK代理:基于接口的动态代理技术

Spring-AOP动态代理技术(底层代码)_spring


目标对象必须有接口,目标对象有什么方法,目标接口就有什么方法,

运行期间基于接口动态生成代理对象,所以代理对象也就有目标对象同样的方法。

注意:以下代码只是底层jdk动态代理实现的方式,我们在开发过程中只需要在配置文件中进行配置即可,这些代码spring会帮你自动生成(这是模拟底层)

(1)创建接口及其实现类

public interface TargetInterface {

public void save();
}public class Target implements TargetInterface{
@Override
public void save() {
System.out.println("save running....");
}
}

(2)创建增强的方法

public class Advice {

public void before(){
System.out.println("前置增强");
}
public void after(){
System.out.println("后置增强");
}
}

(3)测试实现

public class ProxyTest {
public static void main(String[] args) {
//目标对象
final Target target=new Target();

//增强对象
final Advice advice=new Advice();

TargetInterface proxy= (TargetInterface) Proxy.newProxyInstance(
//目标对象类加载器
target.getClass().getClassLoader(),
//目标对象相同的接口字节码对象数组
target.getClass().getInterfaces(),
//调用代理对象的任何方法,实质执行的都是invoke方法
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
advice.before();//前置增强
//执行目标方法
Object invoke = method.invoke(target, args);
advice.after(); //后置增强
return invoke;
}
}
);
//调用代理方法
proxy.save();
}
}

2.cglib代理:基于父类的动态代理技术

Spring-AOP动态代理技术(底层代码)_底层_02


基于目标对象动态生成一个代理对象,类似于继承(但不是继承),代理对象内部调用目标对象,在调用目标对象之前或者之后介入一些其他代码,从而完成的增强。

(1)创建目标对象类

public class Target {
public void save() {
System.out.println("save running....");
}
}

(2)创建增强类

public class Advice {

public void before(){
System.out.println("前置增强");
}
public void after(){
System.out.println("后置增强");
}
}

3.底层实现

public class ProxyTest {
public static void main(String[] args) {
//目标对象
final Target target=new Target();

//增强对象
final Advice advice=new Advice();

//返回值 就是动态生成的代理对象,基于cglib
//1.创建增强器
Enhancer enhancer=new Enhancer();
//2.设置父类(目标对象)
enhancer.setSuperclass(Target.class);
//3.设置回调
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
advice.before(); //执行前置
Object invoke = method.invoke(target, objects);
advice.after(); //执行后置
return invoke;
}
});
//4.生成代理对象
Target proxy= (Target) enhancer.create();
proxy.save();
}
}

结果:
前置增强
save running…
后置增强


上一篇:spring-基于xml的aop开发-快速入门
下一篇:没有了
网友评论