1. Definición de primavera AOP:
(Programación Orientada a Aspectos) Programación Orientada : el proceso de software, antes y después de la ejecución pueden ser extensiones adicionales apropiadas, lo llamamos sección de características. La superficie cortada se puede instalar y quitar fácilmente. Podemos entender visualmente el aspecto como un complemento de navegador, instalarlo cuando sea necesario y desinstalarlo cuando no sea necesario.
- El enfoque de AOP consiste en abstraer y encapsular funciones generales independientes del negocio en clases de aspectos.
- El objetivo final : ampliar el comportamiento del programa en el caso del código fuente de acero inoxidable
- ¿Por qué las funciones extendidas se llaman aspectos?
Respuesta: El proceso de negocio de software normal se ejecuta secuencialmente de arriba a abajo. Las funciones que agregamos se agregan en el proceso de ejecución del software original como una sección transversal.
En segundo lugar, conceptos relacionados con AOP
Uno, la relación entre spring aop y AspectJ:
-
Eclipse AspectJ, un lenguaje de programación orientado a aspectos basado en la plataforma java, tiene un sistema completo que puede realizar el concepto de programación orientada a aspectos aop en tiempo de ejecución.
-
Pero Spring Aop no se implementa completamente con AspectJ, solo se basa en AspectJWeaver en la parte inferior para lograr la coincidencia de clases y métodos
Como se muestra en la captura de pantalla, el proceso de esta delineación del alcance es confiar en AspectJWeaver para lograr
3. El principio central de Spring AOP es usar el modo proxy para implementar la extensión de la función de tiempo de ejecución del objeto.
En segundo lugar, los conceptos clave
anotación | Descripción |
---|---|
Aspecto | Aspectos, funciones específicas de componentes conectables, generalmente un aspecto solo implementa una función general. La esencia es una clase estándar, no es necesario heredar e implementar otras clases. El formato debe ser público y el valor de retorno puede ser nulo u objeto |
Clase / método de destino | La clase de destino / método de destino se refiere al método que realmente debe ejecutarse y relacionarse con el negocio. La función es similar a los métodos de inserción y creación en servicio y dao |
PointCut | Punto de entrada: use la expresión de ejecución para explicar en qué clases del sistema debe actuar el aspecto |
JoinPoint | El punto de conexión es el objeto que contiene los metadatos de la clase / método de destino durante la operación del aspecto. Esto debe pasarse en el método de aspecto. Metadatos: información que describe la clase de destino y el método de destino |
Consejo | Notificaciones, que indican el momento de ejecución de aspectos específicos. Spring incluye cinco tipos diferentes de notificaciones. |
Tres, proceso de configuración de AOP:
- Depende de AspectJ
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<!--spring aop的底层依赖-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.5</version>
</dependency>
</dependencies>
- Darse cuenta de la clase de aspecto, método
// 切面类
public class MethodAspect {
// 切面方法,用于扩展额外功能
public void printExecutionTime(JoinPoint joinpoint) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss SSS");
String now = sdf.format(new Date());
String className = joinpoint.getTarget().getClass().getName();//获取目标类名
String methodName = joinpoint.getSignature().getName();// 获取目标方法名
System.out.println("---->" + now + ":" + className + "." + methodName);
}
}
-
Configurar Aspect Bean
-
Definir PointCut (qué métodos de qué clases del sistema se ven afectados por el aspecto actual)
-
Configurar notificación de aviso
La versión completa del archivo de configuración es la siguiente:
<?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:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd">
<bean id="userDao" class="com.imooc.spring.aop.dao.UserDao"/>
<bean id="userService" class="com.imooc.spring.aop.service.UserService">
<property name="userDao" ref="userDao"/>
</bean>
<bean id="employeeDao" class="com.imooc.spring.aop.dao.EmployeeDao"/>
<bean id="employeeService" class="com.imooc.spring.aop.service.EmployeeService">
<property name="employeeDao" ref="employeeDao"/>
</bean>
<!--2,aop配置:配置切面类Aspect Bean-->
<bean id="methodAspect" class="com.imooc.spring.aop.aspect.MethodAspect">
</bean>
<aop:config>
<!--3,定义PointCut-->
<!--pointcut:切点,使用expression表达式说明作用范围-->
<!--execution(public * com.imooc..*.*(..))说明切面的作用com.imooc包下所有类的所有方法-->
<aop:pointcut id="pointcut" expression="execution(public * com.imooc..*.*(..))"/>
<!--4,定义切面类-->
<aop:aspect ref="methodAspect">
<!--5,配置Advice通知:before通知,代表在目标方法运行前运行methodAspect.printExecutionTime方法-->
<aop:before method="printExecutionTime" pointcut-ref="pointcut"/>
</aop:aspect>
</aop:config>
</beans>
Cuarto, el objeto JoinPoint
JoinPoint: obtenga la información principal de la clase objetivo y el método objetivo
Demostración de código específico
Si desea rastrear y depurar proyectos en línea en el trabajo real, puede agregar este aspecto y usar el registro de inicio de sesión para generar los parámetros
Cinco, expresión de punto de corte PointCut
- público se puede omitir
- El valor de retorno puede coincidir con cualquier (*), también puede ser vacío o String, objeto, etc.
- Por ejemplo, si quiero hacer coincidir el nombre de la clase que contiene el servicio, se puede escribir como * servicio y los demás son iguales
- Regalar una castaña