跳到主要内容
版本:7.0.3

使用“自动代理”功能

Hunyuan 7b 中英对照 Using the "auto-proxy" facility Using the "auto-proxy" facility

到目前为止,我们已经考虑过使用ProxyFactoryBean或类似的工厂Bean来显式创建AOP代理了。

Spring还允许我们使用“自动代理”(auto-proxy)bean定义,这种定义可以自动代理选定的bean。这是基于Spring的“bean后处理器”(bean post processor)架构实现的,该架构能够在容器加载时修改任何bean定义。

在这个模型中,你需要在XML bean定义文件中设置一些特殊的bean定义来配置自动代理基础设施。这样你就可以声明哪些目标对象适合进行自动代理了。你不需要使用ProxyFactoryBean

有两种方法可以做到这一点:

  • 通过使用一个能够引用当前上下文中特定bean的自动代理创建器。

  • 自动代理创建的一个特殊案例,值得单独考虑:由源代码级别的元数据属性驱动的自动代理创建。

自动代理bean定义

本节涵盖了由org.springframework.aop.framework.autoproxy包提供的自动代理创建器。

BeanNameAutoProxyCreator

BeanNameAutoProxyCreator 类是一个 BeanPostProcessor,它会为名称与字面值或通配符匹配的 Bean 自动创建 AOP 代理。以下示例展示了如何创建一个 BeanNameAutoProxyCreator Bean:

<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属性,而不是一个拦截器列表,这是为了确保原型顾问(prototype advisors)能够正确工作。“interceptors”这个名称可以指顾问(advisors),也可以指任何类型的建议(advise)。

与自动代理(auto-proxying)通常的情况一样,使用BeanNameAutoProxyCreator的主要目的是以最少的配置量,对多个对象一致地应用相同的配置。它是将声明式事务(declarative transactions)应用于多个对象的常用选择。

名称匹配的bean定义,例如前面示例中的jdkMyBeanonlyJdk,只是带有目标类的普通bean定义。BeanNameAutoProxyCreator会自动创建AOP代理。同样的规则也适用于所有匹配的bean。需要注意的是,如果使用了顾问(而不是前面示例中的拦截器),那么切入点对不同bean的适用方式可能会有所不同。

DefaultAdvisorAutoProxyCreator

一个更通用且极其强大的自动代理创建器是DefaultAdvisorAutoProxyCreator。它能够自动应用当前上下文中符合条件的顾问(advisors),而无需在自动代理顾问的bean定义中包含具体的bean名称。它具备与BeanNameAutoProxyCreator相同的优点,即配置的一致性以及避免重复。

使用这一机制涉及:

  • 指定一个 DefaultAdvisorAutoProxyCreator bean 定义。
  • 在相同或相关的上下文中指定任意数量的顾问(advisors)。请注意,这些必须都是顾问(advisors),而不是拦截器(interceptors)或其他形式的建议(advices)。这是必要的,因为必须有一个切入点(pointcut)来进行评估,以检查每个建议是否适用于候选的 bean 定义。

DefaultAdvisorAutoProxyCreator 会自动评估每个顾问(advisor)中包含的切点(pointcut),以确定它应该将哪些建议(advice)应用到每个业务对象上(例如示例中的 businessObject1businessObject2)。

这意味着可以为每个业务对象自动应用任意数量的顾问(advisors)。如果任何顾问中的切点(pointcut)与业务对象中的任何方法都不匹配,那么该对象就不会被代理。当为新的业务对象添加bean定义时,如果需要的话,这些新对象也会被自动代理。

自动代理(Auto-proxying)通常具有这样的优势:它能够防止调用者或依赖项获取到未经过适当配置的对象。在这个ApplicationContext上调用getBean("businessObject1")会返回一个AOP代理,而不是目标业务对象。(前面提到的“内部bean”(inner bean)用法也同样具有这一优点。)

以下示例创建了一个 DefaultAdvisorAutoProxyCreator bean 以及本节中讨论的其他元素:

<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"/>

如果想要对许多业务对象一致地应用相同的建议(advice),DefaultAdvisorAutoProxyCreator就非常有用。一旦基础设施定义到位,你就可以添加新的业务对象而无需包含具体的代理配置。此外,你还可以轻松地添加额外的功能(例如跟踪或性能监控方面),而只需对配置进行最小的修改。

DefaultAdvisorAutoProxyCreator 支持过滤(通过使用命名规范来确保只评估特定的顾问,这使得在同一个工厂中可以使用多个配置不同的 AdvisorAutoProxyCreator)和排序。如果需要确保正确的排序顺序,顾问可以实现 org.springframework.core.Ordered 接口。前面示例中使用的 TransactionAttributeSourceAdvisor 具有可配置的排序值,默认设置是无序的。