Spring框架學習1.1
Spring框架學習1.1
AOP概念與底層原理
什麼是AOP
(1)面向切面程式設計(方面),利用AOP可以對業務邏輯的各個部分進行隔離,從而使得
業務邏輯各部分之間的耦合度降低,提高程式的可重用性,同時提高了開發的效率。(2)通俗描述:不通過修改原始碼方式,在主幹功能裡面新增新功能
(3)使用登入例子說明AOP
AOP底層原理
1、AOP底層使用動態代理
(1)有兩種情況動態代理
第一種 有介面情況,使用JDK動態代理
- 建立介面實現類代理物件,增強類的方法
第二種 沒有介面情況,使用CGLIB動態代理
- 建立子類的代理物件,增強類的方法
AOP(JDK動態代理)
1、使用JDK動態代理,使用Proxy類裡面的方法建立代理物件
(1)呼叫newProxyInstance方法
方法有三個引數:
第一引數,類載入器
第二引數,增強方法所在的類,這個類實現的介面,支援多個介面
第三引數,實現這個介面InvocationHandler,建立代理物件,寫增強的部分
2、編寫JDK動態代理程式碼
(1)建立介面,定義方法
public interface UserDao {
public int add(int a,int b);
public String update(String id);
}
(2)建立介面實現類,實現方法
public class UserDaoImpl implements UserDao { @Override public int add(int a, int b) { return a+b; } @Override public String update(String id) { return id; } }
(3)使用Proxy類建立介面代理物件
public class JDKProxy { public static void main(String[] args) { //建立介面實現類代理物件 Class[] interfaces = {UserDao.class}; UserDaoImpl userDao = new UserDaoImpl(); UserDao dao = (UserDao)Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new UserDaoProxy(userDao)); int result = dao.add(1, 2); System.out.println("result:"+result); } } //建立代理物件程式碼 class UserDaoProxy implements InvocationHandler { //1 把建立的是誰的代理物件,把誰傳遞過來 //有引數構造傳遞 private Object obj; public UserDaoProxy(Object obj) { this.obj = obj; } //增強的邏輯 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //方法之前 System.out.println("方法之前執行...."+method.getName()+" :傳遞的參 數..."+ Arrays.toString(args)); //被增強的方法執行 Object res = method.invoke(obj, args); //方法之後 System.out.println("方法之後執行...."+obj); return res; } }
AOP術語
AOP操作(準備工作)
1、Spring框架一般都是基於AspectJ實現AOP操作
(1)AspectJ不是Spring組成部分,獨立AOP框架,一般把AspectJ和Spirng框架一起使
用,進行AOP操作
2、基於AspectJ實現AOP操作
(1)基於xml配置檔案實現
(2)基於註解方式實現(使用)
3、在專案工程裡面引入AOP相關依賴
4、切入點表示式
(1)切入點表示式作用:知道對哪個類裡面的哪個方法進行增強
(2)語法結構: execution([許可權修飾符] [返回型別] [類全路徑] 方法名稱 )
舉例1:對com.atguigu.dao.BookDao類裡面的add進行增強
execution(* com.atguigu.dao.BookDao.add(..))
舉例2:對com.atguigu.dao.BookDao類裡面的所有的方法進行增強
execution(* com.atguigu.dao.BookDao.* (..))
舉例3:對com.atguigu.dao包裡面所有類,類裡面所有方法進行增強
execution(* com.atguigu.dao.. (..))
AOP操作(AspectJ註解)
1、建立類,在類裡面定義方法
public class User {
public void add() {
System.out.println("add.......");
}
}
2、建立增強類(編寫增強邏輯)
(1)在增強類裡面,建立方法,讓不同方法代表不同通知型別
//增強的類
public class UserProxy {
public void before() {//前置通知
System.out.println("before......");
}
}
3、進行通知的配置
(1)在spring配置檔案中,開啟註解掃描
//增強的類
@Component
@Aspect //生成代理物件
public class UserProxy {
6、有多個增強類多同一個方法進行增強,設定增強類優先順序
(1)在增強類上面添加註解 @Order(數字型別值),數字型別值越小優先順序越高
@Component
@Aspect
@Order(1)
public class PersonProxy
7、完全使用註解開發