AOP-aspectJ实现前置通知、后置通知、环绕通知、传参

applicationContext.xml

		<aop:config>
	        <aop:aspect ref="myadvice">
	        	<aop:pointcut id="mypoint" expression="execution(* cn.wit.test.Demo.Demo1())" />
	        	<aop:before method="mybefore" pointcut-ref="mypoint"/>
	        	<aop:after method="myafter" pointcut-ref="mypoint"/>
	        	<aop:after-returning method="afterreturn" pointcut-ref="mypoint"/>
	        	<aop:around method="myarround" pointcut-ref="mypoint"/>
	        </aop:aspect>
        </aop:config>
        
        <bean id="demo" class="cn.wit.test.Demo"></bean>

myadvice

  • 其中after标签和afterreturning标签的区别是after异常了也会执行后置通知
  • afterreturning标签对应的方法有异常就不会执行
public class MyAdvice {
    
    
	public void mybefore(){
    
    
		System.out.println("前置");
	}
	public void myafter(){
    
    
		System.out.println("后置");
	}
	public void  afterreturn(){
    
    
		System.out.println("后置returning");
	}
	public Object  myarround(ProceedingJoinPoint p) throws Throwable{
    
    
		System.out.println("环绕-前置");
		Object result = p.proceed();
		System.out.println("环绕-后置");
		return result;
	}
}

测试

在这里插入图片描述

传参

  • aspectJ相比于schema-based,传参要麻烦很多
  • 下面有一份前置通知,demo1方法有int和string两个参数

applicationContext.xml

  • args(int id1,String name1)中参数来自于切点方法(int id,String name),参数个数、类型和顺序必须一致
  • args后边的参数、 arg-names(int id1,String name1)的参数类型和参数名必须一致
  • advice(int id2,String name2)中参数必须和arg-names参数个数、类型和顺序一致
<bean id="myadvice" class="cn.wit.advice.MyAdvice"></bean>
        
        <aop:config>
	        <aop:aspect ref="myadvice">
	        	<aop:pointcut id="mypoint" expression="execution(* cn.wit.test.Demo.Demo1(int,String)) and args(id1,name1)" />
	        	<aop:before method="mybefore" pointcut-ref="mypoint" arg-names="id1,name1"/>
	        </aop:aspect>
        </aop:config>
        
        <bean id="demo" class="cn.wit.test.Demo"></bean>

myadvice

public class MyAdvice {
    
    
	public void mybefore(int id2,String name2){
    
    
		System.out.println("前置"+id2+name2);
	}
}


测试

public class Test {
    
    
	public static void main(String[] args) {
    
    
		ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
		Demo demo = ac.getBean("demo",Demo.class);
		try {
    
    
			demo.Demo1(1,"张三");
		} catch (Exception e) {
    
    
		} 
	}
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/WA_MC/article/details/112568523
今日推荐