如何使用Spring AOP的通知类型及创建通知

  


  

  

1. springaop中共有六种通知类型,只要我们自定义一个类实现对应的接口,它们全都是org.springframework。aop包中的。
  

  

2. aop的连接点可以是方法调用,方法调用本身,类初始化,对象实例化时,但是SpringAOP中全是方法调用,更简单,也最实用

  

           通知名称   接口               前置通知   org.springframework.aop.MethodBeforeAdvice         后置返回通知   org.springframework.aop.AfterReturningAdvice         后置通知   org.springframework.aop.AfterAdvice         环绕通知   org.springframework.aop.MethodInterceptor         异常通知   org.springframework.aop.ThrowsAdvice         引入通知   org.springframework.aop.IntroductionInterceptor            

  

写一个公共类,用于目标对象

        公共类人{   私人字符串名称;   公共布尔saySomething(字符串){   System.out.println (“Pereson类中说了一句:" +);   返回true;//默认返回现实   }   公共字符串getName () {   返回名称;   }   公共空间setName(字符串名称){   this.name=名称;   }   }      


  

  

前置通知可以修改传递给方法的参数,并且可以通过抛出异常来阻止方法的执行,可以用前置通知实现用户登录的验证,SpringSecurity就是这么做的

  

1。例子:在一个方法执行前将包含方法名称的消息写入到控制台中,并且将传入的参数修改下。(文章中写的内容比较小,大多数在代码中有注释,大家可以下载代码查看)

     /* *   *前置通知类   */公共类BeforeAdvice实现MethodBeforeAdvice {         @Override   公共空间之前(方法方法,对象[]对象,@Nullable对象o)抛出Throwable {//第一个参数是目标方法对象,第二个是参数,第三个是做为调用目标的对象(这是personr实例)//打印方法名   System.out.println(“要执行的方法是:”+ method.getName ());//修改参数为lyn4ever   对象[0]=" lyn4ever”;//我们修改成为了lyn4ever,所以打印出来的就是lyn4ever,而不是zhangsan   }         公共静态void main (String [] args) {   人的人=new ();      ProxyFactory pf=new ProxyFactory ();   pf.addAdvice(新BeforeAdvice ());   pf.setTarget(人);      人代理=(人)pf.getProxy ();//我这里传的参数是zhangsan,理论上它应该打印出来zhangsan   proxy.saySomething (“zhangsan”);   }   }      

如何使用Spring AOP的通知类型及创建通知

  

没毛病,本来我输入的是zhangsan,在aop中将参数改为了lyn4ever,这样就完美的替换了。

  


  

  

是在连接点(方法调用)返回后执行,这显然不能像上边那样修改参数,也不能修改返回值。但是可以抛出可以发送到堆栈的异常,同样也可以调用其他方法。
  

     /* *   *后置返回通知   */公共类AfterReturnAdvice实现AfterReturningAdvice {      @Override   公共空afterReturning (@Nullable对象o,方法方法,对象[]对象,@Nullable对象o1)抛出Throwable {/*   参数和前置通知是一样的   这个是在返回之后调用,因此,人中的saySomething会先打印,我们在这里修改的参数不起作任何作用   */System.out.println(“调用的方法是:”+ method.getName() +”这句是在saySomething之后");//这句是在saySomething之后   对象[0]=" lyn4ever”;//这句可以修参数,但是之前的方法已经执行过了,所以不起任何作用      System.out.println(“我们修改了参数为:“[0]+对象+”但是没有任何用");//这时候这个参数并不会传到person.saysomething(),因为已经调用过了      }         公共静态void main (String [] args) {   人的人=new ();      ProxyFactory pf=new ProxyFactory ();   pf.addAdvice(新AfterReturnAdvice());//注意修改这个为当前类中的通知类   pf.setTarget(人);      人代理=(人)pf.getProxy ();   proxy.saySomething (“zhangsan”);   }   }      

如何使用Spring AOP的通知类型及创建通知

  


  

  

这人最好理解了,就是在方法调用前后都可以执行代码。看起来像是前置后后置的集合,但是它可以修改方法的返回值,因为它实现的调用方法的返回值是对象,所以我们就可以修改,而前置通知的返回是空白,所以没法修改的。甚至以至于我们可以不调用目标对象中的连接点方法,我们完全修改这个方法的全部代码。

如何使用Spring AOP的通知类型及创建通知