Spring AOP之基于ProxyFactoryBean的代理

本文介绍了Spring AOP中ProxyFactoryBean的使用,通过具体例子展示了如何为单个bean创建AOP代理,并探讨了其背后的类图结构。

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

ProxyFacotryBean的方式实际上相当于Proxy+FactoryBean,适合于对单个bean的aop代理。

1. 使用举例:

<bean id="personTarget">
    <property name="name"><value>jianchi</value></property>
    <property name="age"><value>26</value></property>
</bean>
<bean id="myAdvisor">
    <property name="someProperty"><value>Custom string property value</value></property>
</bean>
<bean id="person" >
    <property name="proxyInterfaces"><value>com.mycompany.Person</value></property>
    <property name="target"><ref local="personTarget"/></property>
    <property name="interceptorNames">
        <list>
            <value>myAdvisor</value>
        </list>
    </property>
</bean>

2. 类图结构

通过阅读源代码可以知道它的类结构图如下:

可以看到ProxyFactoryBean实际上实现了FactoryBean接口,因此通过它,可以无缝将被织入的对象放入到IOC容器中。
它继承了ProxyCreatorSupport的类,从结构图中也可以看到,这个类有三个子类,每个子类实际上都可以用于织入横切逻辑,实际上织入的过程基本类似,具有很大的相似性,因此spring把这些共同的逻辑放入到了他们的父类中。

其中ProxyFactory和AspectJProxyFactory主要用在程序中直接调用,AspectJProxyFactory支持采用注解的方式定义切面。

ProxyCreatorSupport继承自ProxyConfig,并实现了Advised接口,ProxyConfig定义了织入过程中的通用配置项。Advised定义了对Interceptor,Advise及Advisor的管理操作接口。

ProxyCreatorSupport定义了整个织入过程的通用逻辑,但是最终的代理对象的创建它是委托给了AopProxyFacotyr.可以看到它拥有一个AopProxyFactory属性,它是创建AopProxy的工厂类,最终的横切逻辑的织入主要是通过不同的AopProxy来进行的,spring里面实际上有两种创建Proxy的方式。

可以看到AopProxy有两个子类,分别代表采用jdk动态代理的方式创建proxy和采用cgligb创建proxy。

而AopProxyFactory工厂有个默认实现,DefaultAopProxyFactory.在创建AopProxy的时候到底是实例化哪个类呢?就必须通过AdvisedSupport类的参数来决定了,上代码:
if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) {
            Class targetClass = config.getTargetClass();
            if (targetClass.isInterface()) {
                return new JdkDynamicAopProxy(config);
            }
            return CglibProxyFactory.createCglibProxy(config);
}else {
            return new JdkDynamicAopProxy(config);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值