使用 “auto-proxy” 工具

到目前为止,我们已经考虑使用ProxyFactoryBean或 类似的工厂豆。spring-doc.cadn.net.cn

Spring 还允许我们使用 “auto-proxy” bean 定义,它可以自动 代理选定的 Bean 定义。这是建立在 Spring 的“bean post processor”之上的 基础结构,它允许在容器加载时修改任何 bean 定义。spring-doc.cadn.net.cn

在此模型中,您可以在 XML Bean 定义文件中设置一些特殊的 Bean 定义 配置自动代理基础架构。这样,您就可以声明目标 符合自动代理条件。您无需使用ProxyFactoryBean.spring-doc.cadn.net.cn

有两种方法可以执行此作:spring-doc.cadn.net.cn

  • 通过使用引用当前上下文中特定 bean 的自动代理创建器。spring-doc.cadn.net.cn

  • 值得单独考虑的自动代理创建的特殊情况: 由源级元数据属性驱动的自动代理创建。spring-doc.cadn.net.cn

自动代理 Bean 定义

本节介绍由org.springframework.aop.framework.autoproxy包。spring-doc.cadn.net.cn

BeanNameAutoProxyCreator

BeanNameAutoProxyCreatorclass 是一个BeanPostProcessor,这会自动创建 名称与 Literals 值或通配符匹配的 bean 的 AOP 代理。以下内容 示例演示如何创建BeanNameAutoProxyCreator豆:spring-doc.cadn.net.cn

<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 的正确行为。命名 “interceptors” 可以是顾问或任何建议类型。spring-doc.cadn.net.cn

与一般的自动代理一样,使用BeanNameAutoProxyCreator是 将相同的配置一致地应用于多个对象,并且最小体积为 配置。它是将声明式事务应用于多个 对象。spring-doc.cadn.net.cn

名称匹配的 Bean 定义,例如jdkMyBeanonlyJdk在前面的 例如,是具有 Target 类的普通旧 bean 定义。AOP 代理是 由BeanNameAutoProxyCreator.同样的建议也适用 添加到所有匹配的 bean 中。请注意,如果使用 advisors(而不是 前面的示例),切入点可能以不同的方式应用于不同的 bean。spring-doc.cadn.net.cn

DefaultAdvisorAutoProxyCreator

一个更通用且极其强大的自动代理创建者是DefaultAdvisorAutoProxyCreator.这会自动将符合条件的顾问程序应用于 当前上下文,而无需在 auto-proxy 中包含特定的 bean 名称 顾问的 bean 定义。它提供了一致的配置和 避免重复 asBeanNameAutoProxyCreator.spring-doc.cadn.net.cn

使用此机制涉及:spring-doc.cadn.net.cn

  • 指定DefaultAdvisorAutoProxyCreatorbean 定义。spring-doc.cadn.net.cn

  • 在相同或相关上下文中指定任意数量的 advisor。请注意,这些 必须是顾问,而不是拦截器或其他建议。这是必要的, 因为必须有一个切入点进行评估,来检查每个建议的资格 添加到候选 bean 定义中。spring-doc.cadn.net.cn

DefaultAdvisorAutoProxyCreator自动计算包含的切入点 在每个 advisor 中,查看它应该适用于每个业务对象的建议(如果有) (例如businessObject1businessObject2在示例中)。spring-doc.cadn.net.cn

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

自动代理通常具有使调用者无法或 dependencies 获取 un-advised 对象。叫getBean("businessObject1")在这个ApplicationContext返回 AOP 代理,而不是目标业务对象。(“内部 bean“惯用语也提供了这个好处。spring-doc.cadn.net.cn

以下示例创建一个DefaultAdvisorAutoProxyCreatorBean 和其他 本节讨论的元素:spring-doc.cadn.net.cn

<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如果您想应用相同的建议,则非常有用 始终如一地应用于许多业务对象。一旦基础设施定义就位, 您可以添加新的业务对象,而无需包含特定的代理配置。 您还可以轻松加入其他方面(例如,跟踪或 性能监控方面),对配置进行最小更改。spring-doc.cadn.net.cn

DefaultAdvisorAutoProxyCreator提供对筛选的支持(通过使用命名 约定,以便仅评估某些 advisor,这允许使用多个 配置不同,AdvisorAutoProxyCreators 在同一个工厂中)和排序。 顾问可以实现org.springframework.core.Ordered接口以确保 如果这是一个问题,请正确排序。这TransactionAttributeSourceAdvisor用于 前面的示例具有可配置的 order 值。默认设置为 unordered。spring-doc.cadn.net.cn


APP信息