aop的概念以及 cglib-nodep-2.1_3.jar第三方jia包動態代理使用


引入 cglib-nodep-2.1_3.ja包

cglib產生的代理類是目標類的子類

定義接口,讓切面都繼承它,方便加入到動態代理方法 的那個類中使用

SalaryInterceptor類中使用 private List<Interceptor> interceptors; 

1 package cn.itcast.cglibproxy.salary;
2 
3 public interface Interceptor {
4     public void interceptor();
5 }
Logger .java
 1 package cn.itcast.cglibproxy.salary;
 2 
 3 public class Logger implements Interceptor{
 4 
 5     @Override
 6     public void interceptor() {
 7         // TODO Auto-generated method stub
 8         System.out.println("logging");
 9     }
10     
11 }

其他類都繼承 Interceptor接口

Privilege.java

 1 package cn.itcast.cglibproxy.salary;
 2 
 3 public class Privilege implements Interceptor{
 4 
 5     @Override
 6     public void interceptor() {
 7         // TODO Auto-generated method stub
 8         System.out.println("privilege");
 9     }
10     
11 }

Security.java

 1 package cn.itcast.cglibproxy.salary;
 2 
 3 public class Security implements Interceptor{
 4 
 5     @Override
 6     public void interceptor() {
 7         // TODO Auto-generated method stub
 8         System.out.println("security");
 9     }
10     
11 }

等等

目標對象

1 package cn.itcast.cglibproxy.salary;
2 
3 public class SalaryManagerImpl {
4     public void showSalary() {
5         System.out.println("查看工資");
6     }
7 }

核心

 1 package cn.itcast.cglibproxy.salary;
 2 
 3 import java.lang.reflect.Method;
 4 import java.util.List;
 5 
 6 import net.sf.cglib.proxy.Enhancer;
 7 import net.sf.cglib.proxy.MethodInterceptor;
 8 import net.sf.cglib.proxy.MethodProxy;
 9 
10 public class SalaryInterceptor implements MethodInterceptor{
11 
12     
13     private Object target;
14     
15     private List<Interceptor> interceptors;
16     
17     public SalaryInterceptor(Object target,List<Interceptor> interceptors){
18         this.target = target;
19         this.interceptors = interceptors;
20     }
21     //返回動態代理對象
22     public Object createProxy(){
      //增強對象
23 Enhancer enhancer = new Enhancer(); 24 enhancer.setCallback(this); 25 enhancer.setSuperclass(this.target.getClass()); 26 return enhancer.create(); 27 } 28 //酷似jdk中的 invoke方法 29 //arg3中存放方法的代理相關參數 30 @Override 31 public Object intercept(Object arg0, Method arg1, Object[] arg2, 32 MethodProxy arg3) throws Throwable { 33 // TODO Auto-generated method stub 34 for(Interceptor interceptor:interceptors){ 35 interceptor.interceptor(); 36 } 37 arg1.invoke(this.target, arg2); 38 return null; 39 } 40 41 42 }

 

測試

 1 package cn.itcast.cglibproxy.salary;
 2 
 3 import java.lang.reflect.Proxy;
 4 import java.util.ArrayList;
 5 import java.util.List;
 6 
 7 import org.junit.Test;
 8 
 9 public class SalaryTest {
10     @Test
11     public void test(){
12         Object target = new SalaryManagerImpl();
13         Logger logger = new Logger();
14         Security security = new Security();
15         Privilege privilege = new Privilege();
16         List<Interceptor> interceptors = new ArrayList<Interceptor>();
17         interceptors.add(logger);
18         interceptors.add(security);
19         interceptors.add(privilege);
20         //返回的是目標類型的子類
21         SalaryInterceptor interceptor = new SalaryInterceptor(target, interceptors);
22         SalaryManagerImpl proxy = (SalaryManagerImpl)interceptor.createProxy();
23         proxy.showSalary();
24     }
25 }

 

aop:

   1、切面

        事務、日志、安全性框架、權限等都是切面  相當於例子中的 Logger Privilege

   2、通知

      切面中的方法就是通知                         上面類的方法

   3、目標類                SalaryManagerImpl類

   4、切入點                                            在方法SalaryInterceptor 中的intercept方法中判斷條件 ,什么條件調用目標方法

         只有符合切入點,才能讓通知和目標方法結合在一起

   5、織入:

         形成代理對象的方法的過程

    

好處:

   事務、日志、安全性框架、權限、目標方法之間完全是松耦合的

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM