Hasta ahora hemos analizado la creación explícita de un proxy AOP utilizando un ProxyFactoryBean o un bean de fábrica similar.

Spring también nos permite usar definiciones de beans "auto-proxy", que pueden representar automáticamente las definiciones de beans seleccionadas. Este principio se basa en la infraestructura de "postprocesador de beans" de Spring, que permite modificar cualquier definición de bean a medida que se carga el contenedor.

En este modelo, establece algunas definiciones de beans específicas en su archivo de definición de beans XML para configurar la infraestructura de proxy automático. Esto le permite declarar objetivos que sean adecuados para el proxy automático. No es necesario utilizar ProxyFactoryBean.

Puedes hacer esto de dos maneras:

  • Usar un creador de proxy automático que haga referencia a beans específicos en el contexto actual.

  • Un caso especial de creación de proxy automático que merece una consideración especial: la creación de un proxy automático basado en atributos de metadatos a nivel de fuente.

Definiciones de beans con proxy automático

Esta sección cubre los creadores de proxy automático proporcionados por el paquete org.springframework.aop.framework.autoproxy.

BeanNameAutoProxyCreator

La clase BeanNameAutoProxyCreator es un BeanPostProcessor que crea automáticamente servidores proxy AOP para beans con nombres que coinciden con valores literales o comodines. El siguiente ejemplo muestra cómo crear un bean 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>

Al igual que en ProxyFactoryBean, aquí hay una propiedad interceptorNames, en lugar de una lista de interceptores, para garantizar la lógica correcta de los asesores prototipo. Los "interceptores" denominados pueden ser asesores o consejos de cualquier tipo.

Al igual que con el autoproxy en general, el objetivo principal de usar BeanNameAutoProxyCreator es aplicar consistentemente la misma configuración a múltiples objetos con una configuración mínima. Esta es una forma popular de aplicar transacciones declarativas a múltiples objetos.

Las definiciones de beans que tienen el mismo nombre, como jdkMyBean y onlyJdk en el ejemplo anterior, son definiciones de beans normales con una clase objetivo. El proxy AOP se crea automáticamente usando BeanNameAutoProxyCreator. El mismo consejo se aplica a todos los frijoles relevantes. Tenga en cuenta que si se utilizan asesores (en lugar del interceptor en el ejemplo anterior), los sectores se pueden aplicar de manera diferente a diferentes beans.

DefaultAdvisorAutoProxyCreator

Un creador de proxy automático más común pero extremadamente eficaz es DefaultAdvisorAutoProxyCreator. Aplica automáticamente los EA apropiados en el contexto actual, sin la necesidad de incluir nombres de beans específicos en la definición de bean EA de proxy automático. Ofrece los mismos beneficios de configuración consistente y prevención de duplicaciones que BeanNameAutoProxyCreator.

Los usos de este mecanismo incluyen:

  • Configuración de la definición del bean DefaultAdvisorAutoProxyCreator.

  • Asignar cualquier número de asesores en el mismo contexto o en contextos adyacentes. Tenga en cuenta que deben ser asesores, no interceptores u otros avisos. Esto es necesario porque debe existir una porción calculada para verificar que cada sugerencia coincida con las definiciones de los contenedores candidatos.

DefaultAdvisorAutoProxyCreator calcula automáticamente la porción contenida en cada asesor para saber qué consejo (si corresponde) debe aplicar a cada objeto de negocio (por ejemplo, businessObject1 y businessObject2 en el ejemplo).

Esto significa que se puede aplicar automáticamente cualquier número de asesores a cada objeto comercial. Si ninguno de los asesores coincide con algún método del objeto comercial, el objeto no será proxy. A medida que se agregan definiciones de beans para nuevos objetos comerciales, se transfieren automáticamente si es necesario.

La ventaja del autoproxy en general es que evita que el código de llamada o las dependencias obtengan un objeto que no cuenta con asesoramiento. Llamar a getBean("businessObject1") en este ApplicationContext devuelve el proxy AOP, no el objeto comercial de destino. (El enfoque del "contenedor interior" que se mostró anteriormente también proporciona este beneficio).

El siguiente ejemplo crea el bean DefaultAdvisorAutoProxyCreator y los demás elementos tratados en esta sección:

<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 es muy útil si necesita aplicar consistentemente los mismos consejos a muchos objetos comerciales. Una vez que se crean las definiciones de infraestructura, se pueden agregar nuevos objetos comerciales sin habilitar una configuración de proxy específica. También puede agregar fácilmente aspectos adicionales (como aspectos de seguimiento o monitoreo del rendimiento) con cambios mínimos de configuración.

DefaultAdvisorAutoProxyCreator ofrece soporte para filtrado (mediante el uso de una convención de nomenclatura para que solo se evalúen asesores específicos, lo que permite utilizar múltiples AdvisorAutoProxyCreators configurados de manera diferente en la misma fábrica) y pedidos. Los asesores pueden implementar la interfaz org.springframework.core.Ordered para garantizar un pedido adecuado si esto supone un problema. El TransactionAttributeSourceAdvisor utilizado en el ejemplo anterior tiene un valor de pedido personalizado. El valor predeterminado es "desordenado".