技术开发 频道

Spring AOP: Spring之面向方面编程

通常,我们不需要ProxyFactoryBean的全部功能,因为我们常常只对一个方面感兴趣: 例如,事务管理。

当我们仅仅对一个特定的方面干兴趣时,我们可以使用许多便利的工厂来创建AOP代理。这些在其他 章节讨论,所以这里我们快速浏览一下它们。

TransactionProxyFactoryBean
用Spring提供的jPetStore的示例应用 演示了TransactionProxyFactoryBean的使用方式。

TransactionProxyFactoryBean是ProxyConfig的子类, 因此基本配置信息是和ProxyFactoryBean共享的。 (见上面ProxyConfig的属性列表。)

下面的代码来自于JPetStore application,演示了ProxyFactoryBean是如何工作的。 跟ProxyFactoryBean一样,存在一个目标bean的定义。 类的依赖关系定义在代理工厂bean定义中(petStore),而不是普通Java对象(petStoreTarget)。

TransactionProxyFactoryBean需要设置一个target属性, 还需要设置“transactionAttributes”, “transactionAttributes”用来指定需要事务化 处理的方法,还有要求的传播方式和其他设置:

<bean id="petStoreTarget" class="org.springframework.samples.jpetstore.domain.logic.PetStoreImpl"> <property name="accountDao"><ref bean="accountDao"/></property> <!-- Other dependencies omitted --> </bean> <bean id="petStore" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"><ref bean="transactionManager"/></property> <property name="target"><ref local="petStoreTarget"/></property> <property name="transactionAttributes"> <props> <prop key="insert*">PROPAGATION_REQUIRED</prop> <prop key="update*">PROPAGATION_REQUIRED</prop> <prop key="*">PROPAGATION_REQUIRED,readOnly</prop> </props> </property> </bean>

TransactionProxyFactoryBean自动创建一个事务advisor, 该advisor包括一个基于事务属性的切入点。因此只有事务性的方法被通知。

TransactionProxyFactoryBean使用preInterceptors和 postInterceptors属性指定“pre”和“post”通知。它们将拦截器,通知和Advisor数组放置 在事务拦截器前后的拦截器链中。使用XML格式的bean定义中的<list>元素定义,就 象下面一样:

<property name="preInterceptors"> <list> <ref local="authorizationInterceptor"/> <ref local="notificationBeforeAdvice"/> </list> </property> <property name="postInterceptors"> <list> <ref local="myAdvisor"/> </list> </property>

 这些属性可以加到上面的“petStore”的bean定义里。一个通用用法是将事务和声明式 安全组合在一起使用:一个和EJB提供的类似的方法。

因为使用前拦截器和后拦截器时,用的是真正的实例引用,而不象在 ProxyFactoryBean中用的bean的名字,因此它们只能用于共享实例的通知。 因此它们不能用在有状态的通知中:例如,在mixin中。这和TransactionProxyFactoryBean的要求是 一致的。如果你需要更复杂的,可以定制的AOP,你可以考虑使用普通的ProxyFactoryBean, 或者是自动代理生成器(参考下面)。

尤其是如果我们将Spring的AOP在许多情况下看成是EJB的替代品,我们会发现大多数通知是很普通的, 可以使用共享实例。声明式的事务管理和安全检查是一个典型的例子。
TransactionProxyFactoryBean依赖于由它的transactionManager 属性指定的TransactionManager。 这种事务管理方式是可插拔的,基于JTA,JDBC或者其他事务管理策略皆可。 这与Spring的事务抽象层有关,而不在于AOP本身。我们将在下一章中讨论事务机制。

如果你只对声明性事务管理感兴趣,TransactionProxyFactoryBean是一个不错的解决办法, 并且比直接使用ProxyFactoryBean来得简单.
EJB 代理
其它有一些专门的代理用于创建EJB代理,使得EJB的“业务方法”的接口可以被调用代码直接使用。 调用代码并不需要进行JNDI查找或使用EJB的创建方法:这是在可读性和架构灵活性方面的重大提高。 

0
相关文章