zoukankan      html  css  js  c++  java
  • Spring 的AOP底层实现技术:JDK和CGLIB动态代理

    Spring 的AOP实现技术之JDK的动态代理技术实例:

    接口:IUserService

    (Spring的AOP是动态AOP,实现技术:JDK提供的动态代理和cglib代理,
    cglib它可以为没有实现接口的类做代理,也可以为接口类做代理.如果有接口,使用JDK动态代理,如果没有,使用cglib动态代理.)

    利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理

    1 public interface IUserService {
    2     public void login(String username,String password);
    3     public void regist();
    4 }

    实现类

     1 public class UserServiceImpl implements IUserService {
     2     @Override
     3     public void login(String username,String password) {
     4         System.out.println("登录......");
     5     }
     6     @Override
     7     public void regist() {
     8         System.out.println("注册.......");
     9     }
    10 }

    代理工厂

     1 //使用jdk的proxy完成动态代理工具
     2 public class JDKProxyFactory implements InvocationHandler{
     3 //创建目标对象,将传进来的对象赋值给本类对象就代理.
     4     private Object target;
     5     public  JDKProxyFactory(Object target){
     6         this.target=target;
     7     };      
     8 //通过目标对象创建代理对象
     9     public Object createProxy(){
    10         //使用Proxy完成代理对象的创建
    11         //得到目标对象的classLoder
    12         ClassLoader loader = target.getClass().getClassLoader();
    13         //得到目标对象的interfaces
    14         Class<?>[] interfaces = target.getClass().getInterfaces();
    15         //实现InvocationHandler接口,this就是创建代理对象的
    16         return Proxy.newProxyInstance(loader, interfaces, this);
    17     }
    18     @Override
    19     public Object invoke(Object proxy, Method method, Object[] args)
    20             throws Throwable {
    21         //在代理实例上处理方法调用并返回
    22         //proxy是代理对象,method是调用的方法的method方法,args是调用的方法的参数
    23         System.out.println("日志文件");
    24         //target=UserServiceImpl--目标对象
    25         return method.invoke(target, args);
    26     }

    测试类

    1 public class ProxyTest {
    2     @Test
    3     public void test1(){
    4     //创建目标对象
    5     IUserService userService = new UserServiceImpl();
    6     //创建代理对象
    7     JDKProxyFactory factory = new JDKProxyFactory(userService);
    8     IUserService userServiceProxy = (IUserService) factory.createProxy();
    9     userServiceProxy.login("Tom","123");}}

     Spring 的AOP实现技术之CGLIB的动态代理技术实例:

    CGLIB包底层是使用一个小而快的字节码处理框架ASM

     接口IUserService

    public interface IUserService {
        public void login(String username,String password);
        public void regist();
    }

    实现类UserService

    public class UserServiceImpl /*implements IUserService*/ {
        //@Override
        public void login(String username,String password) {
            System.out.println("登录......");
        }
        //@Override
        public void regist() {
            System.out.println("注册.......");
        }
    }

    CglibProxyFactory 代理工厂

    public class CglibProxyFactory implements MethodInterceptor  {
     //得到目标函数
     private Object target;
     //使用构造方法传递目标对象
     public CglibProxyFactory(Object target){
          this.target=target;
     }
     //创建代理对象
     public Object createProxy(){
         //1.创建enhancer
        Enhancer enhancer = new  Enhancer();
        //2.传递目标对象
        enhancer.setSuperclass(target.getClass());
        //3.设置回调参数(相当于Invocationhandler)
        enhancer.setCallback(this);
        return enhancer.create(); 
     }
    @Override
    //增强目标对象
    public Object intercept(Object proxy, Method method, Object[] args,
            MethodProxy methodProxy) throws Throwable {
        //在代理实例上处理方法调用并返回
        System.out.println("执行目标方法前");
      Object result =method.invoke(target, args);
       System.out.println("执行目标方法后");
         return result;

    测试类

    public class CglibTest {
        @Test
        public void test1(){
            //创建目标
            UserServiceImpl userSerice = new UserServiceImpl();
            //创建代理类,传递目标对象
        CglibProxyFactory factory= new CglibProxyFactory(userSerice);
        //生成IUserService的代理类
        UserServiceImpl userSericeproxy = (UserServiceImpl) factory.createProxy();
        userSericeproxy.login("tom", "123");
    }
  • 相关阅读:
    SAP GUI中按F1后显示的帮助窗口为空白
    SAP事务代码之IMG设置
    RFC 同步异步调用实例
    SAP R/3 与其他异构系统集成时是否需要应用 SAP XI
    SAP 用户管理事务代码
    SAP 模块中文解释
    SAP Table 类型
    SAP System Tables
    开发SAP的语言
    IDOC 创建,增强,管理,配置
  • 原文地址:https://www.cnblogs.com/wwwzzz/p/7900565.html
Copyright © 2011-2022 走看看