Spring AOP y transacciones

(1) Plantilla de transacción

try{
    //1:开启事务
    //2:执行操作
    //3:提交事务
    //4:返回结果
}catch (Exception e){
     //5:回滚操作
}finally {
     //6:释放资源
}

(2) AOP: programación orientada a aspectos, tarea: no modifique el código fuente durante el período de ejecución del programa para mejorar los métodos existentes

Ventajas: reduzca el código repetitivo, mejore la eficiencia del desarrollo y el mantenimiento conveniente

Método de implementación: use tecnología de proxy dinámico

Realice implementando la configuración

Opción: si hay una interfaz o una forma de implementar subclases para la programación aop. En primavera, el marco decidirá qué método de proxy dinámico usar de acuerdo con si la clase de destino implementa la interfaz.

(3) Punto de unión: punto de conexión, el llamado punto de conexión se refiere a aquellos puntos que se interceptan, en primavera, estos puntos se refieren a métodos, porque el resorte solo admite puntos de conexión de tipos de métodos

Pointcut: El punto de entrada, el llamado punto de entrada se refiere a la definición que queremos interceptar esos Joinpoints

Todos los puntos de entrada son puntos de conexión, pero no todos los puntos de conexión son puntos de entrada

aviso: La llamada notificación significa que lo que se debe hacer después de interceptar Joinpoint es la notificación. Los tipos de notificaciones son: notificación previa, notificación posterior, notificación de excepción y notificación final

Todo el método de invocación se ejecuta en la notificación envolvente, y habrá una llamada de punto de entrada clara en la notificación envolvente.

Introducción: Introducción es un tipo especial de notificación. Introducción puede agregar dinámicamente algunos métodos o campos a la clase durante el tiempo de ejecución sin modificar el código de la clase.

Objetivo: objeto objetivo, el objeto objetivo del agente.

Weaving: Weaving es el proceso de aplicar mejoras a los objetos de destino para crear nuevos objetos proxy. Spring usa el tejido proxy dinámico, mientras que AspectJ usa el tejido en tiempo de compilación y el tejido de carga de clases.

Proxy: proxy, después de que una clase es tejida y mejorada por aop, se genera una clase de proxy de resultado

Aspecto: Aspecto, es una combinación de punto de entrada y notificación (introducción)

(4) Qué hacer

x: En la etapa de desarrollo, los programadores deben escribir el código comercial principal (línea principal de desarrollo); la mayoría de los programadores lo hacen y requieren estar familiarizados con los requisitos comerciales.

Extraiga el código común y haga un aviso. (Hágalo al final de la etapa de desarrollo); los programadores aop lo hacen.

En el archivo de configuración, declare la relación entre el punto de entrada y la notificación, es decir, el aspecto. aop programadores para hacer

xx: La fase de ejecución la completa el marco de primavera. Spring framework monitorea la ejecución del método pointcut. Una vez que se monitorea el método pointcut, utiliza el mecanismo proxy para crear dinámicamente el objeto proxy del objeto objetivo.

Según la categoría de notificación, la función correspondiente de la notificación se teje en la posición correspondiente del objeto proxy para completar la operación lógica de código completa.

(5) 13_spring AOP basado en XML

1、把通知bean交给spring管理
2、使用aop:config标签表名开始aop配置
3、使用aop:aspect标签表名配置切面
   id:是给切面提供一个唯一标识
   ref:是指定通知类的bean的id
4、在aop:aspect标签内部使用对应的标签来配置通知的类型
   前置通知:aop:before
               method:用于指定Logger类中那个方法是前置通知
               pointcut:用于指定切入点表达式,该表达式的含义指的是对业务层中哪些方法增强
                    切入点表达式写法:关键字:execution(表达式)
                           表达式:访问修饰符  返回值  包名.包名.包名.....类名.方法名(参数列表)
                    标准表达式写法:public void cn.rzpt.service.impl.AccountServiceImpl.saveAccount()
                    服务修饰符可以省略;返回值可以使用通配符,表示任意返回值;
                    包名可以使用通配符,表示任意包,但是有几级包,就需要写几个 *.;包名可以使用..,表示当前包和子包
                    类名和方法名都可以使用通配符来实现通配;
                    参数列表可以直接写数据类型
                        基本数据类型直接写类型名称
                        引用数据类型写包名.类名的方式
                        可以使用通配符表示任意类型,但是必须有参数;可以使用 .. 表示有无参数均可,有参数表示任意类型
                    全通配写法:* *..*.*(..)
                    实际开发中切入点表达式的通常写法:
                       切到业务层实现类下的所有方法
                       写法:* cn.rzpt.service.impl.*.*(..)
<!--前置通知:在切入点方法执行之前执行-->
<!--后置通知:在切入点方法正常执行之后执行-->
<!--异常通知:在切入点方法执行产生异常之后执行-->
<!--最终通知:无论切入点方法是否正常执行,都会在切入点方法之后执行-->

Expresión de configuración pointcut: aop-pointcut

id: se usa para especificar el identificador único de la expresión, expresión se usa para especificar el contenido de la expresión

Luego use pointcut-ref como referencia

Esta etiqueta se escribe como contenido de la etiqueta aop: aspecto, que solo se puede usar para el aspecto actual; también se puede escribir fuera de aop: aspecto, que se puede usar para todos los aspectos, y debe estar antes de aop: aspecto, en orden.

Configurar la notificación envolvente:

Problema: cuando se configura la notificación envolvente, el método pointcut no se ejecuta y se ejecuta el método de notificación

Análisis: la notificación envolvente del agente dinámico tiene una llamada de método de punto de entrada clara

Solución: El marco de Spring proporciona una interfaz: ProceedingJoinPoint. Esta interfaz tiene un método proceda (), que es equivalente a llamar al método pointcut explícitamente. Esta interfaz se puede utilizar como parámetro de método de la notificación circundante. Cuando se ejecuta el programa, el marco de primavera se

Proporcionamos la clase de implementación de esta interfaz para su uso.

La notificación envolvente en Spring es una forma proporcionada por Spring Framework para controlar manualmente cuándo se ejecuta el método mejorado en el código.

(6) Configuración de AOP basada en anotaciones de Spring (hay un problema con la secuencia de ejecución de la llamada, tenga cuidado al seleccionar el marco técnico, pero la notificación circundante es correcta)

No utilice el método de configuración xml,

@Configuración

@ComponentScan (paquetes base = "cn.rzpt")

@EnableAspectJAutoProxy

 

@Component ("logger") 
@Aspect 
public class Logger {...     
    @Pointcut ("ejecución (* * .. *. * (..))") 
    public void pt1 () {} 

    @Before ("pt1 () ") 
    public void beforePrintLog () 
    ... 
}
<! - Configure el paquete para que sea escaneado cuando Spring cree el contenedor -> 
<! - Entregue la notificación a la gerencia de Spring -> 
<! - Configuración del servicio -> 
<! - Configure en la clase de aspecto-- > 
<! - Configure Spring para habilitar el soporte de AOP de anotaciones -> 
<context: component-scan base-package = "cn.rzpt"> </ context: component-scan> 

<aop: aspectj-autoproxy> </ aop: Aspectj- autoproxy>
@Service ("accountService") 
clase pública AccountServiceImpl

 

 

 

 

 

 

 

Supongo que te gusta

Origin blog.csdn.net/sky2line/article/details/109465605
Recomendado
Clasificación