Spring框架的四种通知

Posted lmff

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring框架的四种通知相关的知识,希望对你有一定的参考价值。

前置通知:

实现类:

package org_shitang_servier;

import org_shitang.dao.IStudentDao;
import org_shitang_dao.impl.StudentDaoImp1;
import org_shitang_entity.student;

public class StudentServideImp1 implements IstudentService{
    IStudentDao studentDao = (IStudentDao) new StudentDaoImp1();
    public void setStudentDao(IStudentDao studentDao){
        this.studentDao=studentDao;
    }
    public void addStudent(student student){
        studentDao.addStudent(student);
    }
    public void deleteStudentByNo(int stuNo){
        System.out.println("模拟删除");
    }
    
}

前置通知LogBefor()通过一个接口实现特定功能

package org_shitang_aop;

import java.lang.reflect.Method;

import org.springframework.aop.MethodBeforeAdvice;
//普通类转换成前置通知
public class LogBefore implements MethodBeforeAdvice{
    //前置通知的具体内容
    @Override
    public void before(Method method, Object[] args, Object target) throws Throwable {
        System.out.println("前置通知。。。。");
        
    }
    
    
    
}

bean配置:

<!-- 配置前置通知  -->
    <!-- addStudent()所在方法 -->
    <bean id="studentService" class="org_shitang_servier.StudentServideImp1">
        <property name="studentDao" ref="studentDao"></property>
    </bean>
    <!-- 前置类 -->
    <bean id="LogBefore" class="org_shitang_aop.LogBefore">     
    </bean>
    <!-- 进行连接 -->
    <aop:aspectj-autoproxy proxy-target-class="true"/>
    <aop:config>
        <!-- 配置切入点 -->
        <aop:pointcut expression="execution(public void org_shitang_servier.StudentServideImp1.deleteStudentByNo(int)) or execution(public void org_shitang_servier.StudentServideImp1.addStudent(org_shitang_entity.student))" id="pointcut"/>
        <aop:advisor advice-ref="LogBefore" pointcut-ref="pointcut"/>
    </aop:config>

后置通知LogAfter()

package org_shitang_aop;

import java.lang.reflect.Method;

import org.springframework.aop.AfterReturningAdvice;

public class LogAfter implements AfterReturningAdvice {

    @Override
    public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
        System.out.println("后置通知:目标对象"+target+",调用的方法名:"+method.getName()+",参数的个数"+args.length+",返回值:"+returnValue);
        
    }
    
}

bean配置:

<bean id ="LogAfter" class="org_shitang_aop.LogAfter"></bean>
    <aop:aspectj-autoproxy proxy-target-class="true"/>
    <aop:config>
        <!-- 配置切入点 -->
        <aop:pointcut expression="execution(public void org_shitang_servier.StudentServideImp1.deleteStudentByNo(int)) or execution(public void org_shitang_servier.StudentServideImp1.addStudent(org_shitang_entity.student))" id="pointcut1"/>
        <aop:advisor advice-ref="LogAfter" pointcut-ref="pointcut1"/>
    </aop:config>

异常通知LogException()

package org_shitang_aop;

import java.lang.reflect.Method;

import org.springframework.aop.ThrowsAdvice;

public class LogException implements ThrowsAdvice{
    //异常通知的具体方法
    public void afterThrowing(Method method,Object[] args,Object target,Throwable ex){
        System.out.println("异常通知:目标对象"+target+",调用的方法名:"+method.getName()+",参数的个数"+args.length+",异常:"+ex.getMessage());
    }
}

bean配置:

<bean id="LogException" class="org_shitang_aop.LogException">
    </bean>
    <aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
    <aop:config>
        <aop:pointcut expression="execution(public void org_shitang_servier.StudentServideImp1.deleteStudentByNo(int)) or execution(public void org_shitang_servier.StudentServideImp1.addStudent(org_shitang_entity.student))" id="pointcut2"/>
        <aop:advisor advice-ref="LogException" pointcut-ref="pointcut2" />
    </aop:config>
    

环绕LogAround()

package org_shitang_aop;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.expression.MethodExecutor;

public class LogAround implements MethodInterceptor{

    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable {
        //方法体1
        Object result=null;
        try{
            //前置通知
            System.out.println("用环绕通知写的前置通知");
            result=invocation.proceed();//控制着目标代码的执行:相当于addStudent()
            //返回目标代码的返回值
            //后置通知
            System.out.println("用环绕通知写的后置通知");
        }catch(Exception e){
            //异常通知
            System.out.println("用环绕通知写的异常通知");
        }
        return result;
    }
    
}

bean配置:

<!-- 环绕通知 -->
    <bean id="LogAround" class="org_shitang_aop.LogAround">
    </bean>
    <aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
    <aop:config>
        <aop:pointcut expression="execution(public void org_shitang_servier.StudentServideImp1.deleteStudentByNo(int)) or execution(public void org_shitang_servier.StudentServideImp1.addStudent(org_shitang_entity.student))" id="pointcut3"/>
        <aop:advisor advice-ref="LogAround" pointcut-ref="pointcut3" />
    </aop:config>

 

以上是关于Spring框架的四种通知的主要内容,如果未能解决你的问题,请参考以下文章

mysql查看版本的四种方法

Spring AOP 中 advice 的四种类型 before after throwing advice around

实现spring事务的四种方式

Spring事务管理的四种方式(以银行转账为例)

Spring事务管理的四种方式(以银行转账为例)

Spring获取上下文的四种方式方式