Spring中的ProxyFactoryBean

jav*_*guy 34 java spring

有人可以用简单的术语解释ProxyFactoryBean吗?我看到这被引用了很多地方.

ska*_*man 52

ProxyFactoryBean用于将拦截器逻辑应用于现有目标bean,以便在调用该bean上的方法时,在该方法调用之前和之后执行拦截器.这是面向方面编程(AOP)的一个例子.

最好用一个简单的例子来解释.AOP的经典用例是将缓存应用于方法调用的结果.这可以使用ProxyFactoryBean如下方式连线:

<bean id="targetService" class="com.x.MyClass"/>

<bean id="cachingInterceptor" class="com.x.MyCachingInterceptor"/>

<bean id="cachedService" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="target" ref="targetService"/>
    <property name="interfaces">
        <list>              
            <value>com.x.MyService</value>
        </list>
    </property>
    <property name="interceptorNames">
        <list>
            <value>cachingInterceptor</value>
        </list>
    </property>
</bean>
Run Code Online (Sandbox Code Playgroud)

我们有一个targetService类型的bean com.x.MyClass,它实现了接口com.x.MyService.我们还有一个名为interceptor bean cachingInterceptor,它实现了接口org.aopalliance.intercept.MethodInterceptor.

此配置将生成一个名为的新bean cachedService,它实现了该MyService接口.对该对象上的方法的任何调用都将首先通过cachingInterceptor对象的invoke()方法传递,在这种情况下,该方法将在其内部缓存中查找以前方法调用的结果.它将返回缓存的结果,或允许方法调用继续进行适当的方法targetService.

targetService 它本身一无所知,它完全没有意识到所有这些AOP正在发生的事情.

ProxyFactoryBean 由于各种原因(例如远程存根,事务管理)在Spring内部大量使用以生成代理,但它也非常适合在应用程序逻辑中使用.


mdm*_*dma 6

ProxyFactoryBean将方面应用于现有bean.首先使用现有的bean(目标bean),弹簧"包装"以添加您提供的方面.返回的bean与原始bean具有相同的接口,但是在目标bean的方法周围编织了其他方面.