到目前为止,我们已经考虑过通过使用 或 类似的工厂豆。ProxyFactoryBean

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

在此模型中,您在 XML Bean 定义文件中设置了一些特殊的 Bean 定义 配置自动代理基础结构。这允许您声明目标 符合自动代理条件。您不需要使用 .ProxyFactoryBean

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

  • 通过使用引用当前上下文中特定 Bean 的自动代理创建器。

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

自动代理 Bean 定义

本部分介绍软件包提供的自动代理创建者。org.springframework.aop.framework.autoproxy

BeanNameAutoProxyCreator

该类是自动创建的 名称与文本值或通配符匹配的 Bean 的 AOP 代理。以下 示例演示如何创建 Bean:BeanNameAutoProxyCreatorBeanPostProcessorBeanNameAutoProxyCreator

<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
	<property name="beanNames" value="jdk*,onlyJdk"/>
	<property name="interceptorNames">
		<list>
			<value>myInterceptor</value>
		</list>
	</property>
</bean>

与 一样,有一个属性而不是一个列表 拦截器,以允许原型顾问的正确行为。命名为“拦截器” 可以是顾问或任何类型的建议。ProxyFactoryBeaninterceptorNames

与一般的自动代理一样,使用的主要目的是 将相同的配置一致地应用于多个对象,并且体积最小 配置。它是将声明性事务应用于多个 对象。BeanNameAutoProxyCreator

名称匹配的 Bean 定义,例如前面的 和 例如,是带有目标类的普通旧 Bean 定义。AOP 代理是 由 .同样的建议也适用 到所有匹配的豆子。请注意,如果使用顾问(而不是拦截器 前面的示例),这些切点可能以不同的方式应用于不同的 Bean。jdkMyBeanonlyJdkBeanNameAutoProxyCreator

DefaultAdvisorAutoProxyCreator

一个更通用和极其强大的自动代理创建器是 。这会自动将符合条件的顾问应用于 当前上下文,无需在自动代理中包含特定的 Bean 名称 顾问的 Bean 定义。它提供了一致配置和 避免重复,如 .DefaultAdvisorAutoProxyCreatorBeanNameAutoProxyCreator

使用此机制涉及:

  • 指定 Bean 定义。DefaultAdvisorAutoProxyCreator

  • 在相同或相关上下文中指定任意数量的顾问。请注意,这些 必须是顾问,而不是拦截者或其他建议。这是必要的, 因为必须有一个切点来评估,以检查每个建议的资格 到候选 Bean 定义。

自动评估包含的切入点 在每个顾问中,查看它应该应用于每个业务对象的建议(如果有) (例如示例中的 and)。DefaultAdvisorAutoProxyCreatorbusinessObject1businessObject2

这意味着可以自动将任意数量的顾问应用于每个业务 对象。如果任何顾问中没有一个切入点与业务对象中的任何方法匹配, 对象未代理。当为新的业务对象添加 Bean 定义时, 如有必要,它们会自动代理。

一般来说,自动代理的优点是使呼叫者无法或 依赖项来获取 un-advise 对象。调用此值将返回 AOP 代理,而不是目标业务对象。(“内 前面显示的 bean“成语也提供了这个好处。getBean("businessObject1")ApplicationContext

下面的示例创建一个 bean 和另一个 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

提供对筛选的支持(通过使用命名 约定,以便仅评估某些顾问,这允许使用多个, 配置不同,AdvisorAutoProxyCreators 在同一工厂)和订购。 顾问可以实施该接口以确保 如果这是一个问题,请正确排序。中使用的 前面的示例具有可配置的订单值。默认设置为无序。DefaultAdvisorAutoProxyCreatororg.springframework.core.OrderedTransactionAttributeSourceAdvisor