此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Framework 6.2.10! |
使用“自动代理”工具
到目前为止,我们已经考虑了通过使用ProxyFactoryBean
或
类似工厂豆。
Spring 还允许我们使用“自动代理”bean 定义,它可以自动 代理选择的 Bean 定义。这是建立在 Spring 的“bean 后处理器”之上的 基础设施,它允许在容器加载时修改任何 Bean 定义。
在此模型中,您在 XML Bean 定义文件中设置了一些特殊的 Bean 定义
以配置自动代理基础结构。这使您可以声明目标
符合自动代理的条件。您无需使用ProxyFactoryBean
.
有两种方法可以做到这一点:
-
通过使用引用当前上下文中特定 bean 的自动代理创建器。
-
值得单独考虑的自动代理创建的特例: 由源级元数据属性驱动的自动代理创建。
自动代理 Bean 定义
本节介绍由org.springframework.aop.framework.autoproxy
包。
BeanNameAutoProxyCreator
这BeanNameAutoProxyCreator
class 是一个BeanPostProcessor
自动创建
名称与文字值或通配符匹配的 bean 的 AOP 代理。以下内容
示例演示了如何创建BeanNameAutoProxyCreator
豆:
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames" value="jdk*,onlyJdk"/>
<property name="interceptorNames">
<list>
<value>myInterceptor</value>
</list>
</property>
</bean>
与ProxyFactoryBean
,有一个interceptorNames
属性而不是列表
的拦截器,以允许原型顾问正确行为。命名为“拦截器”
可以是顾问或任何建议类型。
与一般的自动代理一样,使用的主要点BeanNameAutoProxyCreator
是
将相同的配置一致地应用于多个对象,并将最小体积
配置。它是将声明性事务应用于多个
对象。
名称匹配的 Bean 定义,例如jdkMyBean
和onlyJdk
在前面的
示例,是具有目标类的普通旧 Bean 定义。AOP 代理是
由BeanNameAutoProxyCreator
.同样的建议也适用
到所有匹配的豆子。请注意,如果使用顾问(而不是
前面的示例),切入点可能以不同的方式应用于不同的 bean。
DefaultAdvisorAutoProxyCreator
一个更通用且极其强大的自动代理创建器是DefaultAdvisorAutoProxyCreator
.这会自动将符合条件的顾问应用于
当前上下文,无需在自动代理中包含特定的 bean 名称
advisor 的 bean 定义。它具有相同的优点,即配置一致,并且
避免重复BeanNameAutoProxyCreator
.
使用此机制涉及:
-
指定
DefaultAdvisorAutoProxyCreator
bean 定义。 -
在相同或相关上下文中指定任意数量的顾问。请注意,这些 必须是顾问,而不是拦截者或其他建议。这是必要的, 因为必须有一个切入点来评估,以检查每个建议的资格 到候选 bean 定义。
这DefaultAdvisorAutoProxyCreator
自动计算包含的切入点
在每个顾问程序中,查看它应该应用于每个业务对象的哪些建议(如果有的话)
(例如businessObject1
和businessObject2
在示例中)。
这意味着可以自动将任意数量的顾问应用于每个业务 对象。如果任何顾问程序中没有切入点与业务对象中的任何方法匹配, 对象未代理。当为新业务对象添加 Bean 定义时, 如有必要,它们会自动代理。
一般来说,自动代理的优点是使呼叫者无法或
依赖项来获取非建议对象。叫getBean("businessObject1")
关于这个ApplicationContext
返回 AOP 代理,而不是目标业务对象。(“内部
前面显示的“bean”习语也提供了这个好处。
以下示例创建了一个DefaultAdvisorAutoProxyCreator
豆子和另一个
本节讨论的元素:
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>
<bean class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">
<property name="transactionInterceptor" ref="transactionInterceptor"/>
</bean>
<bean id="customAdvisor" class="com.mycompany.MyAdvisor"/>
<bean id="businessObject1" class="com.mycompany.BusinessObject1">
<!-- Properties omitted -->
</bean>
<bean id="businessObject2" class="com.mycompany.BusinessObject2"/>
这DefaultAdvisorAutoProxyCreator
如果您想应用相同的建议,则非常有用
一致地对许多业务对象。基础架构定义到位后,
您可以添加新的业务对象,而不包括特定的代理配置。
您还可以轻松地放入其他方面(例如,跟踪或
性能监控方面),只需对配置进行最小的更改。
这DefaultAdvisorAutoProxyCreator
提供对筛选的支持(通过使用
约定,以便仅评估某些顾问,这允许使用多个
配置不同,AdvisorAutoProxyCreators 在同一工厂中)和排序。
顾问可以实现org.springframework.core.Ordered
接口以确保
如果这是一个问题,请正确订购。这TransactionAttributeSourceAdvisor
用于
前面的示例具有可配置的订单值。默认设置为无序。