zoukankan      html  css  js  c++  java
  • 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、织入:

             形成代理对象的方法的过程

        

    好处:

       事务、日志、安全性框架、权限、目标方法之间完全是松耦合的

  • 相关阅读:
    2015第18周日
    CreateProcess的使用方法
    A ResourcePool could not acquire a resource from its primary factory or source
    ThreadPool.QueueUserWorkItem的性能问题
    Cucumber 入门一
    菜鸟版JAVA设计模式-从抽象与实现说桥接模式
    ServiceStack.Hello——跨平台.net REST api服务搭建
    android看不见main函数怎么办?程序异常了,能够不提示“xxx软件停止执行”吗?
    深入探讨this指针
    问卷星调查学生对《算法》教学的建议与反馈
  • 原文地址:https://www.cnblogs.com/telwanggs/p/5357780.html
Copyright © 2011-2022 走看看