Spring(十二)--Spring AspectJ

               Spring AspectJ

  AspectJ是一個面向切面的框架,它擴展了Java語言。AspectJ定義了AOP語法,因此它有一個專門的編譯器用來生成遵照Java字節編碼規範的Class文件。html

  AspectJ 是一個面向切面的框架!定義了AOP的語法!spring

  Spring 將AspectJ 整合到了本身的框架中!express

  須要引入兩個核心jar框架

    01.aspectj.weaveride

    02.spring-aspects測試

  (若是你使用的是idea  所需的全部pom節點,在這兒:http://www.javashuo.com/article/p-kqshsgwm-dh.html編碼

  務必掌握的  AspectJ 的切入點表達式idea

    execution([訪問權限類型] 返回值類型 [完整限定類名]方法名 (參數) [拋出的異常類型])spa

    execution( 返回值類型  方法名(參數))代理

 

  *:0-N的字符

  ..:

    01.若是是在方法參數中,表示參數可有多個或者可無

    02.若是是在包名以後,表示當前包和子包

  +:

    01.若是定義在類後面,表示當前類以及子類

    02.若是定義在接口後面,表示當前接口以及實現類

例子:

1. 使用註解實現

/**
 * 當前類就是 整個程序中須要的各類系統級業務
 * 就是一個切面類
 */
@Aspect
public class MyAspectJ {

    @Before("execution(* *..UserDao.sleep(..))")
    public void  before(){
        System.out.println("前置加強........");
    }

    @AfterReturning("execution(* *..UserDao.sleep(..))")
    public void  afterReturning(){
        System.out.println("後置加強........");
    }
//若是想獲取方法的返回值
    @AfterReturning(value = "execution(* *..UserDao.sleep(..))",returning = "result")
    public void  afterReturning(String result){
        System.out.println("後置加強........"+result);
    }

    /**
     * 環繞加強能夠改變返回值
     */
    @Around("execution(* *..UserDao.eat(..))")
    public Object  around(ProceedingJoinPoint point){
        System.out.println("環繞加強進來........");
        Object result=null;
        try {
             result=  point.proceed(); //執行目標方法
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        System.out.println("環繞加強出去........");
        return  "orange";
    }
}

2. 對應的xml文件和測試方法

 

<!--01.配置目標對象-->
<bean id="userDao" class="com.xdf.dao.UserDaoImpl"/>

  <!--02.配置切面-->
<bean id="myAspectJ" class="com.xdf.annotation.MyAspectJ"/>

 <!--03.註冊aspectj的自動代理-->
<aop:aspectj-autoproxy/>

//測試方法
@Test
public  void  defaultTest(){
    ApplicationContext context=new ClassPathXmlApplicationContext("spring.xml");
    UserDao dao= context.getBean("userDao", UserDao.class);
  //  System.out.println(dao.eat());
    dao.sleep();
}

 

3. 使用純切面的方式實現

 

public class MyAspectJ {

    public void  before(){
        System.out.println("前置加強........");
    }

    public void  afterReturning(){
        System.out.println("後置加強........");
    }

    /**
     * 環繞加強能夠改變返回值
     */
    public Object  around(ProceedingJoinPoint point){
        System.out.println("環繞加強進來........");
        Object result=null;
        try {
             result=  point.proceed(); //執行目標方法
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        System.out.println("環繞加強出去........");
        return  "orange";
    }


}

 

4.對應的xml文件和測試方法

 

<!--01.配置目標對象-->
<bean id="userDao" class="com.xdf.dao.UserDaoImpl"/>

  <!--02.配置切面-->
<bean id="myAspectJ" class="com.xdf.annotation.MyAspectJ"/>

 <!--03.註冊aspectj須要的切入點-->
  <aop:config>
      <!--配置切入點表達式-->
      <aop:pointcut id="myPonit" expression="execution(* *..UserDao.sleep(..))"/>
      <aop:pointcut id="myPonit2" expression="execution(* *..UserDao.eat(..))"/>
      <!--配置切面-->
      <aop:aspect ref="myAspectJ">
          <aop:before method="before" pointcut-ref="myPonit"/>
          <aop:after-returning method="afterReturning" pointcut-ref="myPonit"/>
          <aop:around method="around" pointcut-ref="myPonit2"/>
      </aop:aspect>
  </aop:config>

 

@Test
public  void  aspectJTest(){
    ApplicationContext context=new ClassPathXmlApplicationContext("aspectJ.xml");
    UserDao dao= context.getBean("userDao", UserDao.class);
   //System.out.println(dao.eat());
   dao.sleep();
}

 

 

    未完待續!!!

相關文章
相關標籤/搜索