Aviso previo

Habilite el soporte de anotaciones de AspectJ en Spring

Para la primavera aplicaciones de uso AspectJ anotación , debe ruta de clase contener al AspectJ biblioteca : aopalliance.jar , aspectj.weaver.jar y primavera-aspects.jar

Agregue aop Schema al elemento raíz <beans> .

Para habilitar el soporte de anotaciones de AspectJ en el contenedor Spring IOC , simplemente defina un elemento XML vacío en el archivo de configuración de bean < aop: aspectj-autoproxy >

Cuando el resorte COI contenedor detecta la haba archivo de configuración < AOP: AspectJ-autoproxy > el elemento , de forma automática con la AspectJ sección partido de la haba para crear un proxy .

Use las anotaciones de AspectJ para declarar aspectos

Para la primavera comunicado AspectJ sección , sólo el COI de corte envase en el estado de la haba de ejemplo . Cuando la primavera COI contenedor de inicialización AspectJ después del corte , Primavera COI contenedor será para aquellos con AspectJ sección para que coincida con la haba para crear un proxy .

En la anotación AspectJ , el aspecto es solo una clase Java con anotación @Aspect .

Las notificaciones son métodos simples de Java marcados con algún tipo de anotación .

AspectJ admite 5 tipos de anotaciones de notificación :

@Antes: notificación previa , ejecutada antes de la ejecución del método

@ Después : notificación posterior , ejecutada después de la ejecución del método

@ AfterReturning : notificación de devolución , ejecutada después de que el método devuelve el resultado

@ AfterThrowing : notificación de excepción , después de que el método arroje una excepción

@Around: notificación envolvente , ejecutar alrededor del método

Aviso previo

Notificación previa : una notificación que se ejecuta antes de que se ejecute el método

Previa a la notificación mediante @Before notas , valor y puntos de entrada como la expresión del valor de los billetes .

Use la firma del método para escribir la expresión de corte de punto de AspectJ

La expresión de corte de punto más típica coincide con varios métodos de acuerdo con la firma del método :

Ejecución * com.atguigu.spring.ArithmeticCalculator . * (..): Partido ArithmeticCalculator todos los métodos declarado , el primer modificador y * representa cualquier valor de retorno arbitrario . El segundo * representa cualquier método . .. partidos un número arbitrario parámetro . Si la clase de destino y la sección de interfaz en el mismo paquete , se puede omitir el nombre del paquete .

ejecución public * ArithmeticCalculator. * (..): coincide con todos los métodos públicos de la interfaz ArithmeticCalculator .

ejecución public Double ArithmeticCalculator. * (..): coincide con el método de devolver el valor de tipo doble en ArithmeticCalculator

ejecución public double ArithmeticCalculator. * ( double , ..): coincide con el método cuyo primer parámetro es de tipo double .. coincide con cualquier número de parámetros de cualquier tipo

La ejecución pública Doble ArithmeticCalculator * (. Doble , Doble ): parámetros coincidentes de tipo doble, doble método de tipo .

Fusionar expresiones de punto de corte

En AspectJ en , la expresión punto de corte por los operadores &&, || ,! combinado .

Permita que la notificación acceda a los detalles del punto de conexión actual

Se pueden declarar en un método de notificación para el tipo de puntos de inflexión parámetros . A continuación, puede acceder a enlaces con detalle . El nombre del método y los parámetros de los valores .

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/aop 
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
		http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-4.0.xsd">
	
	<!-- 开启注解扫描 -->
	<context:component-scan base-package="com.learn.spring.aspectJ"></context:component-
scan>
	
	<!-- 基于注解开发开启aop自动代理-->
	<aop:aspectj-autoproxy/>
</beans>
package com.learn.spring.aspectJ;

public interface ArithmeticCalculator {
	public  int add(int i, int j );
	public  int sub(int i, int j );
	public  int mul(int i, int j );
	public  int div(int i, int j );
} 
package com.learn.spring.aspectJ;

import org.springframework.stereotype.Component;

@Component
public class ArithmeticCalculatorImpl implements ArithmeticCalculator {

	@Override
	public int add(int i, int j) {
		int result = i + j ;
		return result;
	}

	@Override
	public int sub(int i, int j) {
		int result = i - j ;
		return result;	
	}

	@Override
	public int mul(int i, int j) {
		int result = i * j ;
		return result;
	}

	@Override
	public int div(int i, int j) {
		int result = i / j ;
		return result;
	}
	
}
package com.learn.spring.aspectJ;

import java.util.Arrays;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/**
 * 日志切面
 */
@Component  //标识为组件
@Aspect  //标识为切面
@Order(3)  //指定切面的优先级. 值越小,优先级越高. 标注@Order的切面比不标注@Order切面的优先级高
public class LoggingAspect {

	/**
	 * 通知:  前置   后置   返回   异常  环绕
	 */	
		
	/**
	 * 前置通知: 在方法执行之前执行.
	 * JoinPoint:连接点对象  包含了连接点相关的信息:方法名   方法的参数等....
	 */
	//@Before("execution(public int com.learn.spring.aspectJ.ArithmeticCalculator.add(int,int))")
	//@Before("execution(public int com.learn.spring.aspectJ.ArithmeticCalculator.*(int,int))")
	//任意修饰符任意返回值  com.learn.spring.aspectJ包下的任意类的任意方法   任意参数
	//@Before("execution(* com.learn.spring.aspectJ.*.*(..))")
	@Before("suibian()")
	public void beforeMethod(JoinPoint joinPoint){
		//获取方法名:
		String methodName = joinPoint.getSignature().getName();
		//获取参数
		Object [] args = joinPoint.getArgs();
		System.out.println("The method "+methodName+" begins with "+ Arrays.asList(args));
	}
	
}

package com.learn.spring.aspectJ;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
	public static void main(String[] args) {
		ApplicationContext ctx = 
				new ClassPathXmlApplicationContext("spring-aspectJ.xml");
		ArithmeticCalculator ac = 
				(ArithmeticCalculator)ctx.getBean("arithmeticCalculatorImpl");
		System.out.println(ac.getClass().getName());
		int result = ac.div(2, 1);
		System.out.println("AspectJ-result====>:"+result);
	}
}

 

 

 

 

 

 

2545 artículos originales publicados · 66 elogios · 210,000 visitas

Supongo que te gusta

Origin blog.csdn.net/Leon_Jinhai_Sun/article/details/105570132
Recomendado
Clasificación