使用“自动代理”功能

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

Spring 还允许我们使用“自动代理”bean 定义,它可以自动代理选定的 bean 定义。这是建立在 Spring 的“bean 后处理器”基础设施之上的,该基础设施允许在容器加载时修改任何 bean 定义。

在这种模型中,您在 XML bean 定义文件中设置了一些特殊的 bean 定义,以配置自动代理基础设施。这允许您声明符合自动代理条件的 target。您不需要使用 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 属性而不是拦截器列表,以允许原型通知器(advisor)的正确行为。命名的“拦截器”可以是通知器或任何通知类型。

与一般自动代理一样,使用 BeanNameAutoProxyCreator 的主要目的是以最少的配置量,将相同的配置一致地应用于多个对象。它是将声明式事务应用于多个对象的流行选择。

名称匹配的 bean 定义,例如前面示例中的 jdkMyBeanonlyJdk,是带有目标类的普通旧 bean 定义。AOP 代理由 BeanNameAutoProxyCreator 自动创建。相同的通知应用于所有匹配的 bean。请注意,如果使用通知器(而不是前面示例中的拦截器),则切入点可能对不同的 bean 应用方式不同。

DefaultAdvisorAutoProxyCreator

一个更通用且功能强大的自动代理创建器是 DefaultAdvisorAutoProxyCreator。它自动应用当前上下文中符合条件的通知器,而无需在自动代理通知器的 bean 定义中包含特定的 bean 名称。它提供了与 BeanNameAutoProxyCreator 相同的优点:一致的配置和避免重复。

使用此机制包括

  • 指定 DefaultAdvisorAutoProxyCreator bean 定义。

  • 在相同或相关上下文中指定任意数量的通知器。请注意,这些必须是通知器,而不是拦截器或其他通知。这是必要的,因为必须有一个要评估的切入点,以检查每个通知对候选 bean 定义的适用性。

DefaultAdvisorAutoProxyCreator 自动评估每个通知器中包含的切入点,以查看它应该对每个业务对象(例如示例中的 businessObject1businessObject2)应用什么(如果有的话)通知。

这意味着任意数量的通知器可以自动应用于每个业务对象。如果任何通知器中的任何切入点与业务对象中的任何方法不匹配,则该对象不会被代理。随着为新的业务对象添加 bean 定义,它们会在必要时自动被代理。

通常,自动代理的优点是使调用者或依赖项无法获得未通知的对象。在此 ApplicationContext 上调用 getBean("businessObject1") 返回 AOP 代理,而不是目标业务对象。(前面显示的“内部 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"/>

如果您希望将相同的通知一致地应用于许多业务对象,DefaultAdvisorAutoProxyCreator 非常有用。一旦基础设施定义到位,您就可以添加新的业务对象,而无需包含特定的代理配置。您还可以轻松地插入额外的方面(例如,跟踪或性能监控方面),而对配置的更改最小。

DefaultAdvisorAutoProxyCreator 支持过滤(通过使用命名约定,以便只评估某些通知器,这允许在同一工厂中使用多个不同配置的 AdvisorAutoProxyCreator)和排序。如果这是一个问题,通知器可以实现 org.springframework.core.Ordered 接口以确保正确的排序。前面示例中使用的 TransactionAttributeSourceAdvisor 具有可配置的排序值。默认设置为无序。

© . This site is unofficial and not affiliated with VMware.