2010-08-15 34 views

回答

44

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> 

我们有com.x.MyClass类型,它实现了接口com.x.MyService的豆targetService。我们也有一个名为cachingInterceptor的拦截器bean,它实现了接口org.aopalliance.intercept.MethodInterceptor

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

targetService本身对此一无所知,它完全没有意识到所有这些AOP事情正在进行。

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

+0

在这里添加一件事就是,如果我们有几个'interceptorNames',它们按照这样的顺序应用,那么列表中的第一个是第一个拦截调用等等。 – Vic 2013-11-04 11:40:22

6

ProxyFactoryBean将方面应用于现有的bean。您从现有的bean(目标bean)开始,它弹出“包装”以添加您提供的方面。返回的bean与原始bean具有相同的接口,但是具有围绕目标bean方法编写的附加方面。

相关问题