spring 學習之二 AOP編程

AOP概念spring

  AOP, aspect oriented programing,翻譯過來就是面向切面編程的意思,那什麼叫面向切面編程呢?相對於以前傳統的縱向繼承方式來對原有功能進行功能擴展,express

面向切面編程的好處就是不須要增長源代碼就能夠進行功能擴展。編程

AOP術語spa

  --joinpint(鏈接點): 指那些被攔截到的點,在spring中,這些點指的是方法翻譯

  --pointcut(切入點) : 指要對哪些鏈接點進行攔截定義,即對哪些方法作擴展處理code

  --advice(通知/加強) : 通知是指攔截到joinpoint以後所要作的事情,即擴展的功能自己。而通知根據其出如今相對於切入點(被擴展功能的方法)的位置,而被分爲blog

    前置通知,後置通知,異常通知,最終通知,環繞通知繼承

  --aspect(切面) : 切入點與通知的結合io

 

一個例子class

  從上面的術語和描述可能還不太理解AOP真正的做用,舉一個直白的例子吧,先寫一個Dao方法

public class UserDao {
    //add方法就是切入點
    public void add(User user){
        System.out.print("在這裏添加一個用戶");
    }
}

在發佈第二版的時候,增長了一個功能,就是在添加用戶的時候,打印出添加的用戶信息,那該怎麼實現呢?看下面代碼

public class UserDao {
    //add方法就是切入點
    public void add(User user){
        System.out.print("新增的用戶是 " + user.name);  //新擴展的功能
        System.out.print("在這裏添加一個用戶");
    }
}

很顯然 這樣的作法不是很好,耦合太強,如今咱們看看AOP是怎麼作到這一點的呢?在AOP時,userDao中的add()方法是咱們須要增強功能的方法,也就是術語中的切入點。再

看AOP中的加強代碼(擴展的那部分功能),它並不沒有直接與被擴展的方法userDao.add()關聯起來,而是單獨的代碼塊。

public class UserService {
    //加強,擴展的功能
    public void extendm(User user){
        System.out.print("新增的用戶是 " + user.name);  //新擴展的功能
    }
}

  接着在配置文件中進行aop配置,在執行add方法時,會自動將加強代碼加在其先後,從而達到了不修改源代碼而擴展功能的效果。配置文件寫法

<bean id="userDao" class="com.blueto.aop.UserDao"></bean>
<bean id="userDaoService" class="com.blueto.aop.UserDaoService"></bean>

//aop配置
<aop:config>
    //切入點,被擴展的方法
    <aop:pointcut expression="execution(* com.blueto.aop.UserService.*(..))" id="pointcut1"/>
    //切面
    <aop:aspect ref="userDaoService">
            //擴展的方法
           <aop:before method="extendm" pointcut-ref="pointcut1"/>
    </aop:aspect>
</aop:config>

  上面配置文件中的切入點的表達式的語法爲:

    execution(<訪問修飾符>?<返回類型><方法名>(<參數>)<異常>)

  表示對哪些方法進入功能擴展,即AOP中的加強,寫法有下面幾種,只要理解了意思就好記了

  1)execution(* com.blueto.aop.UserService.add(..))    對add方法加強

  2)execution(* com.blueto.aop.UserService.*(..))    對UserService類中全部方法加強

  3)execution(* *.*(..))    對全部包下面全部類的全部方法加強

  配置文件中的aop:before對應的是前置加強,其餘的加強方式有環繞加強(after-returning),後置加強(around)等

  到此,經過例子說明,AOP的配置文件方式就完成了,整個過程仍是顯得有點複雜,不過和Ioc同樣,這種技術還有一種簡單的實現方式,那就是註解式

註解方式實現AOP

   第一步 配置文件中建立類

<bean id="userDao" class="com.blueto.aop.UserDao"></bean>
<bean id="userDaoService" class="com.blueto.aop.UserDaoService"></bean>

//開啓aop操做
<aop:aspect-autoproxy></aop:aspect-autoproxy>
  

  第二步,在加強類(擴展功能方法)上面添加註解

@Aspect
public class UserService {
     @Before(value="execution(* com.blueto.aop.UserDao.*(..))")
    public void extendm(User user){
        System.out.print("新增的用戶是 " + user.name);  //新擴展的功能
    }
}
相關文章
相關標籤/搜索