..


赞助商链接

AOP - 看点创建

现在让我们看看如何创建一个方面。
首先我们创建一个接口上的例子中,我们将写我们的切入点:






公共接口MyInterface的{





  



公共无效F1();





  



公众诠释F2();





  



公众诠释F3()抛出异常;





  



公共无效F4()抛出异常;





  



公众诠释F5();







 }



要编写一个切入点必须知道的AspectJ切入点指示符 ,在我们的例子中,我们将只使用执行相匹配的连接点的执行方法。
的执行格式是该类型的表达式:
 



执行(修饰符,模式?声明RET型,图案型,图案?名称模式(参数-模式)抛出纹?)

 
其中:
  • 修饰符模式:通过应用可选修饰符参数表示类型的方法。 该值*匹配所有类型的修饰符。
  • RET型模式:它表明了方法的返回类型。 该值*匹配所有类型的回报。
  • 声明型模式:该选项参数,表示的类声明的方法。 *该值是作为一个外卡,以取代完全的类的名称或其中的一部分。
  • 名称模式:该方法的名称。 *该值是作为一个外卡,以取代完全的方法或名称的一部分使用。
  • 参数模式:表明该方法的参数。 该值()表示方法,该方法没有参数,而价值(..)表示方法,接受零个或多个参数。 *该值是作为外卡用来替换的方法类型参数,例如(*,java.lang.String的)匹配的方法,由于采用两个输入中的任何类型,第二类型的第一个参数字符串。
  • 抛出模式:可选参数表示异常类型的方法抛出的,例如,抛出java.lang.Exception的
为了更好地理解语法,我们开始的例子。

首先,我们必须创造我们自己的方面:






 @看点







 {公共类MyAspect



  



 .............







 }



正如我们所看到的类与@看点注解。 这是不够的,因为你必须启用AOP nell'applicationContext XML的支持:





 < - !ENBLING AspectJ的 ​​- >







 <aop:aspectj-autoproxy />









 < - !MYASPECT - >







 <bean id="myAspect" class="it.mrwebmaster.aop.MyAspect" />



一旦你取得了这两个操作就可以创建一个忠告,例如,以前的方法F1(前咨询)执行执行的动作






 @之前(“执行(* it.mrwebmaster.aop.MyInterface.f1 (..))")







公共无效beforeF1(){



  



 System.out.println(“前F1”);







 }



由于可以从代码中看到我们以前使用的注解,它接受作为一个值,确定一个切入点表达式@。 在我们的例子中,表达式匹配所有被称为他们的修饰符,返回类型和参数输入接口it.mrwebmaster.aop.MyInterface F1 indipendetemente方法。
同样,我们可以使用的意见时执行的方法完成其执行(后置通知)正确使用注释@ AfterReturning:






 @ AfterReturning(切入点=“执行(* it.mrwebmaster.aop.MyInterface.f2 (..))",返回=”RETVAL“)







公共无效afterReturningF2(对象RETVAL){



  



 System.out.println(“RETURN F2”+ RETVAL);







 }



此记录以下参数,除了切入点,给予对象的名称的,可以被看作是不二输入参数给定的方法返回。 在这种情况下,切入点表达式是inviarata除的方法,在这种情况下,F2的名称。
非常相似的是,当执行一个方法抛出一个异常(异常通知)使用注释@ AfterThrowing建议:





 @ AfterThrowing(切入点=“执行(* it.mrwebmaster.aop.MyInterface.f3 (..))",投掷=”抛出“)







公共无效afterThrowingF3(Throwable的抛出){

 

  



 System.out.println(“F3抛出”+抛出);







 }



所不同的是,该方法不返回一个对象,但一个例外。

另一种意见类型总是后一种方法执行时,它是时间一般或抛出一个异常(后咨询)。 这建议是实现通过使用@后:






 @后(“执行(* it.mrwebmaster.aop.MyInterface.f4 (..))")







公共无效afterF4(){



  



 System.out.println(“后F4”);







 }



最后,我们看到如何让周围意见“:






 @左右(“执行(* it.mrwebmaster.aop.MyInterface.f5 (..))")







公共无效aroundF5(PJP的proceed){



  



 System.out.println(“之前F5”);



  



尝试{



    



对象RETVAL = pjp.proceed();



    



 System.out.println(“RETURN F5”+ RETVAL);



  



 }捕获(Throwable的E){



    



 System.out.println(“F5抛出”+ E);



  



 }







 }



我们可以看到从切入点表达式代码是不能从其他不同的意见。 什么样的变化是相同的意见,必须明确调用通过类的proceed继续进行,一是它的应用程序作为输入传递方法,该方法的执行。 这个接口提供也使用进行检索方法参数,返回类型,并在该方法被执行对象的信息的其他方法。 这是留给读者任何更深。

为了测试我们的意见,我们能做的就是写一个接口MyInterface的琐碎的实施,并创建一个主要的测试:






 MyInterfaceImpl {公共类实现MyInterface的





  



 @覆盖



  



公共无效F1(){



    



 System.out.println(“F1”);



  



 }





  



 @覆盖



  



公众诠释F2(){



    



 System.out.println(“F2”);



    



返回0;



  



 }





  



 @覆盖



  



公众诠释F3()抛出异常{



    



 System.out.println(“F3”);



    



抛出新的异常(“异常F3”);



  



 }





  



 @覆盖



  



公共无效F4()抛出异常{



    



 System.out.println(“F4”);



  



 }





  



 @覆盖



  



公众诠释F5(){



    



 System.out.println(“F5”);



    



返回0;



  



 }







 }



。nell'applicationContext XML:





 < - !对象:对象 - >







 <bean id="myInterfaceImpl" class="it.mrwebmaster.aop.MyInterfaceImpl" />



主要测试:





公共类主要{





  



公共静态无效的主要(字串[] args){





    



 / **



     



 * Instanz的IoC容器



     



 * /



    



 ApplicationContext中的ApplicationContext ClassPathXmlApplicationContext的=新的(“applicationContext.xml中”);





    



 MyInterface的MyInterface的=(MyInterface的)applicationContext.getBean(“myInterfaceImpl”);





    



 myInterface.f1();



    



 System.out.println ("########## \ N“);





    



 myInterface.f2();



    



 System.out.println ("########## \ N“);





    



尝试{



      



 myInterface.f3();



    



 }赶上(例外五){}



    



 System.out.println ("########## \ N“);





    



尝试{



      



 myInterface.f4();



    



 }赶上(例外五){}



    



 System.out.println ("########## \ N“);





    



 myInterface.f5();



    



 System.out.println ("########## \ N“);



  



 }







 }



春天的Java指南
电子学习
Linux操作系统(课程) Linux操作系统(课程)
完整指南开源系统。 从49€。
PHP(课程) PHP(课程)
全部课程用于创建动态Web站点。 从49€。
Ruby和Ruby on Rails的(课程) Ruby和Ruby on Rails的(课程)
创建Ruby和RoR的软件和Web应用程序。 从39€。
赞助商链接