JDK、CGLIB、Spring 三种实现代理的区别(三)Spring的ProxyFactory

本文详细介绍了Spring的ProxyFactory如何实现代理,它结合了JDK Proxy和CGLIB,根据接口是否存在以及配置来决定使用哪种代理方式。通过示例代码展示了对接口和类进行代理的情况,以及在不同条件下如何切换到CGLIB。通过跟踪源码,揭示了Spring在创建AopProxy时的决策过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前两篇文章中我们说到了JDK proxy和CGLIB实现动态代理的方式,这回说说Spring的方式。Spring中代理对象可通过xml配置方式获得,也可通过ProxyFactory手动编程方式创建对象。我们主要讲手动编程的方式。Spring中的代理对象其实是JDK Proxy和CGLIB Proxy 的结合。
下面我们使用ProxyFactory的方式创建代理对象,顺便看看和JDK的proxy以及CGLIB中的proxy联系。
还是使用前两节中的例子。创建需要代理的类(MyTarget)、接口(PeopleService)及其实现(EnglishService),分别看看对接口和类的代理:

public class MyTarget {
    public void printName() {
        System.err.println("name:Target-");
    }
}
public interface PeopleService {
    public void sayHello();

    public void printName(String name);
}
public class EnglishService implements PeopleService {
   
   
    @Override
    public void sayHello() {
        System.err.println("Hi~");
    }

    @Override
    public void printName(String name) {
        System.err.println("Your name:" + name);
    }
}

下面创建一个MethodInterceptor实现方法调用的前后拦截,这里的拦截只是进行简单的打印信息。
这里需要用到额外的包 aopalliance.jar和aspectjweaver。

import org.aopalliance.intercept.MethodInterceptor;

import org.aopalliance.intercept.MethodInvocation;

public class AroundInteceptor implements MethodInterceptor {
   
   

    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable {
        System.err.println(in
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值