Spring Learning_AOP_Notice

AOP

¿Por qué usar AOP?
Hay tres clases, cada una de las cuales tiene un método add Student (). Si necesitamos verificar si el estudiante que queremos agregar ya existe en la base de datos antes de ejecutar addStudent (), debemos hacerlo por separado Agregar el método check () antes de este método es muy problemático, ¿no es así?
entonces ...
Con AOP (por supuesto, es mucho más que esta función), puede especificar a quién, la máquina virtual, llama a check () por mí cada vez que ejecuta addStudent () para verificarlo, jaja, máquina virtual trabajadora .
Pre-notificación simple
1, configuración xml

<!--    配置前置通知-->
<!--    addPerson所在方法-->
    <bean id="personServiceImpl" class="com.itheima.service.PersonServiceImpl">
        <property name="personDao" ref="personDao">

        </property>
    </bean>
<!--    前置通知类-->
    <bean id="logBefore" class="com.itheima.aop.LogBefore">

    </bean>
<!--    关联-->
    <aop:config>
        <aop:pointcut id="pointcut" expression="execution(public void com.itheima.service.PersonServiceImpl.deletePerson(int)) or execution(public void com.itheima.service.PersonServiceImpl.addPerson(com.itheima.entity.Person))"/>
        <aop:advisor advice-ref="logBefore" pointcut-ref="pointcut"/>
    </aop:config>

Ejemplos de expresiones de expresión:
1. La ejecución de cualquier método público:
ejecución (público * (…))
2. La
ejecución de cualquier método que comience con "conjunto": ejecución ( conjunto * (…))
3.
Cualquiera de la interfaz AccountService Ejecución del método:
ejecución (* com.xyz.service.AccountService. (…))
4. Ejecución de cualquier método definido en el paquete de servicio:
ejecución (
com.xyz.service .. (…))
5. Definido en servicio La
ejecución de cualquier método de cualquier clase en el paquete y todos los subpaquetes : ejecución (* com.xyz.service… . (…))
6. La
ejecución de cualquier método de la clase JoinPointObjP2 definida en el paquete pointcutexp y todos los subpaquetes: ejecución (* com.test.spring.aop.pointcutexp… JoinPointObjP2. (…)) ") El
más cercano (…) es el nombre del método, y el más cercano.
(…)) es el nombre de la clase o el nombre de la interfaz

2. La clase de notificación previa
LogBefore.java implementa la interfaz MethodBeforeAdvice

public class LogBefore implements MethodBeforeAdvice {
    
    
    @Override
    public void before(Method method, Object[] objects, Object o) throws Throwable {
    
    
        System.out.println("前置通知!");
    }
}

La notificación de correo no se escribirá, lo mismo es lo mismo, con prisa.
Notificación de excepción :
configure la notificación de excepción en el contenedor

   <bean id="logException" class="com.itheima.aop.LogException"/>
<!--    异常通知-->
    <aop:config>
        <aop:pointcut id="pointcut" expression="execution(public void com.itheima.service.PersonServiceImpl.deletePerson(int)) or execution(public void com.itheima.service.PersonServiceImpl.addPerson(com.itheima.entity.Person))"/>
        <aop:advisor advice-ref="logException" pointcut-ref="pointcut"/>
    </aop:config>

Clase de notificación de excepción, tenga en cuenta que no nos preguntamos qué método implementar cuando implementamos la interfaz, pero aún tenemos que implementar los siguientes métodos:

package com.itheima.aop;
import org.springframework.aop.ThrowsAdvice;
import java.lang.reflect.Method;
public class LogException implements ThrowsAdvice {
    
    
    public void afterThrowing(Method method, Object[] args, Object target, Throwable throwable){
    
    
        System.out.println("异常通知:目标对象," + target + "方法名," + method.getName() + "方法的参数个数:" + args.length + "异常类型:" + throwable.getMessage());
    }
}

Después de agregar deliberadamente un puntero nulo a personDao en el humano, ejecute:
Inserte la descripción de la imagen aquí
notificación envolvente : es la notificación más poderosa que se puede notificar en cualquier lugar y puede obtener el control total del método objetivo.
Nueva clase de sonido envolvente: LogArround.java

package com.itheima.aop;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class LogArround implements MethodInterceptor {
    
    
    @Override
    public Object invoke(MethodInvocation invocation){
    
    
        Object result = null;
        try {
    
    
            //  前置通知
            System.out.println("环绕前置");
            result = invocation.proceed();//控制目标方法的执行,前面是前置通知,后面是后置通知
            //后置通知
            System.out.print("环绕后置通知:");
            System.out.println("目标对象," + invocation.getThis() + "方法名," + invocation.getMethod().getName() + "方法的参数个数:" + invocation.getArguments().length + "返回参数:" + result);
        } catch (Throwable throwable) {
    
    
            //环绕异常通知
            System.out.println("环绕异常通知");
        }
        return result;
    }
}

Inserte la descripción de la imagen aquí

Que tu corazón sea como flores y árboles

Supongo que te gusta

Origin blog.csdn.net/nbcsdn/article/details/99424449
Recomendado
Clasificación