@AspectJ Tecnología de AOP

1. Tecnología AspectJ

Debido a que el proceso de configuración xml aop es demasiado engorroso, aparece una tecnología AspectJ en desaparición.

2. Indicador de corte de puntos AspectJ compatible con Spring AOP

Los indicadores de pointcut se utilizan para indicar el propósito de las expresiones de pointcut. Actualmente, solo hay un punto de conexión del método de ejecución en Spring AOP. Los indicadores de pointcut de AspectJ compatibles con Spring AOP son los siguientes:

ejecución : se utiliza para hacer coincidir el punto de conexión de la ejecución del método;
dentro : se utiliza para hacer coincidir la ejecución del método dentro del tipo especificado;
esto : se utiliza para hacer coincidir el método de ejecución del tipo de objeto proxy AOP actual; tenga en cuenta que el tipo de objeto proxy AOP coincide, por lo que puede incluir La interfaz importada también coincide con el tipo;
objetivo : se utiliza para hacer coincidir el método de ejecución del tipo de objeto de destino actual; tenga en cuenta que el tipo del objeto de destino coincide, de modo que no incluye la interfaz importada y la coincidencia de tipos;
args : se utiliza para hacer coincidir los parámetros pasados ​​por el método actualmente ejecutado Es el método de ejecución del tipo especificado;
@within : se usa para hacer coincidir el método en el tipo de anotación especificado;
@target : se usa para hacer coincidir el método de ejecución del tipo de objeto de destino actual, donde el objeto de destino contiene la anotación especificada;
@args : se usa Los parámetros pasados para que coincidan con el método ejecutado actualmente mantienen la ejecución de la anotación especificada;
@annotation : se usa para coincidir con el método que el método ejecutado actualmente contiene la anotación especificada;
bean : extensión Spring AOP, AspectJ no tiene indicador para coincidencias específicas El método de ejecución del objeto Bean nombrado ;
corte de punto de referencia : se refiere a otros puntos de entrada con nombre, solo se admite el estilo @ApectJ, no se admite el estilo Schema.

3. Escriba la sintaxis de coincidencia

Primero, comprendamos los comodines para la coincidencia de tipos de AspectJ:

*: coincide con cualquier número de caracteres;
…: coincide con cualquier número de repeticiones de caracteres, como coincidir con cualquier número de subpaquetes en el patrón de tipo, y coincide con cualquier número de parámetros en el patrón de parámetros del método.
+: Coincide con el subtipo del tipo especificado; solo se puede usar como sufijo después del patrón de tipo.

Código:
java.lang.String    匹配String类型;  
java.*.String       匹配java包下的任何“一级子包”下的String类型;  
如匹配java.lang.String,但不匹配java.lang.ss.String  
java..*            匹配java包及任何子包下的任何类型;  
                  如匹配java.lang.String、java.lang.annotation.Annotation  
java.lang.*ing      匹配任何java.lang包下的以ing结尾的类型;  
java.lang.Number+  匹配java.lang包下的任何Number的自类型;  
                   如匹配java.lang.Integer,也匹配java.math.BigInteger 

4. Expresión de combinación de puntos

AspectJ usa y (&&), o (||), no (!) Para combinar expresiones pointcut.
En el estilo Schema, debido a que el uso de "&&" en XML requiere el uso de caracteres de escape "&&" para reemplazarlo, es muy inconveniente, por lo que Spring ASP proporciona y, o, no en lugar de &&, || ,! .

5. Ejemplos de uso de puntos de entrada

ejecución: Utilice "ejecución (expresión de método)" ejecución de método coincidente;
modo descripción
público * * (…) Ejecución de cualquier método público
* cn.javass… IPointcutService. * () Cualquier método sin parámetros en la interfaz IPointcutService bajo el paquete cn.javass y todos los subpaquetes
* cn.javass… . (…) Cualquier método de cualquier clase bajo el paquete cn.javass y todos los subpaquetes

6, ejemplos de tecnología AspectJ

  • Configure pointcut (qué método necesita ser pirateado) y notificación (hacker) a través de anotaciones

  • Producción automática de objetos proxy

1) Crear AppConfig.java

package com.lq.aspect;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@Configuration // 标示为配置类 相当于xml文件
//扫描指定包下包含@Component注解的类,将这个类加入spring bean工程
@ComponentScan(value = {
    
     "com.lq.aspect", "com.lq.dao" })
@EnableAspectJAutoProxy // 启动aspectJ注解aop
public class AppConfig {
    
    

}
  1. Crear clase de aspecto @Aspect
package com.lq.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class LogAspect {
    
    

	/*
	 * 定义切点----需要增强的方法
	 * 
	 */

	@Pointcut("execution(public int com.lq.dao.UserDapImpl.add(..))")
	public void pointCut() {
    
    
	}

	// 环绕通知(循环通知/增强(黑客))

	@Around("pointCut()")
	public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
    
    
		System.out.println("1.鉴权");
		// 调用目标方法

		Object[] args = joinPoint.getArgs();
		args[0] = 22;
		args[1] = 22;
		Object result = joinPoint.proceed();

		System.out.println("2.日志留痕");
		return result;

	}
}

3) Clase de entidad

package com.lq.dao;

import org.springframework.stereotype.Component;

@Component
public class UserDapImpl {
    
    

	public int add(int a,int b) {
    
    
		System.out.println("调用【未实现接口的】UserDaoImpl的add方法");
		return a+b;
	}
}

  1. prueba
package com.lq.proxy;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.lq.aspect.AppConfig;
import com.lq.dao.UserDapImpl;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = AppConfig.class)
public class AspectJTest {
    
    

	@Autowired
	UserDapImpl userDap;

	@Test
	public void testAdd() {
    
    
		System.out.println(userDap.add(11, 22));
	}

}

  1. Los resultados de la prueba son:
九月 29, 2020 10:40:17 下午 org.springframework.test.context.support.AbstractTestContextBootstrapper getDefaultTestExecutionListenerClassNames
信息: Loaded default TestExecutionListener class names from location [META-INF/spring.factories]: [org.springframework.test.context.web.ServletTestExecutionListener, org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener, org.springframework.test.context.support.DependencyInjectionTestExecutionListener, org.springframework.test.context.support.DirtiesContextTestExecutionListener, org.springframework.test.context.transaction.TransactionalTestExecutionListener, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener]
九月 29, 2020 10:40:17 下午 org.springframework.test.context.support.AbstractTestContextBootstrapper getTestExecutionListeners
信息: Using TestExecutionListeners: [org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener@13fee20c, org.springframework.test.context.support.DependencyInjectionTestExecutionListener@4e04a765, org.springframework.test.context.support.DirtiesContextTestExecutionListener@783e6358]
九月 29, 2020 10:40:18 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.GenericApplicationContext@100fc185: startup date [Tue Sep 29 22:40:18 CST 2020]; root of context hierarchy
1.鉴权
调用【未实现接口的】UserDaoImpl的add方法
2.日志留痕
33

Supongo que te gusta

Origin blog.csdn.net/weixin_46822085/article/details/108876782
Recomendado
Clasificación