• 静态代理$动态代理


    什么是静态代理?

    静态代理就是代理模式,给真实类做了个增强的方法

    比如你有个房源,你还有代理人那么这个代理人就会给你的怎是房源的基础上,夸大点让你的房源增加人脉。。。

    就要用到增强方法,就在代理类中给你的方法增强

    //静态代理模式
    public class Progects {
    /*
    @Test

    public void dd() {
    //真实代理
    Subject jk=new Real();
    //代理对象
    Proxy hj=new Proxy();
    //调度代理对象(jk)方法增强
    hj.setSubject(jk);
    hj.add();
    }
    */


    接下来就是

    JDK动态代理实现:

    @Test
    public void dds() {
    ///JDk动态代理
    final IUserDao jk=new UserDaoimpl();
    三个参数
    new出一个代理的实例
    类加载器,类接口最后一个是接口的实现类
    IUserDao poxy=(IUserDao)Proxy.newProxyInstance(jk.getClass().getClassLoader(), jk.getClass().getInterfaces(), new InvocationHandler() {

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    System.out.println("事务已经开启");
    调度这个方法里的invoke对象的jk
    method.invoke(jk,args);
    * @param proxy : 当前代理类的一个实例; 若在invoke()方法中调用proxy的非final方法,将造成无限循环调用.


    return null;
    }
    });
    //最后代理方法当然要开启
    poxy.add();
    poxy.edit();
    }
    动态代理的AOP底层实现,有接口自动用的是JDK动态代理




    CGLib动态代理


       @Test
    public void ddss() {
    ///CGLIb动态代理
    final UserService service=new UserService();
    //Enhancer对象 有了这个对象就能事项动态代理
    Enhancer enhancer=new Enhancer();
    //在内存中构建业务类的子类
    enhancer.setSuperclass(service.getClass());
    enhancer.setCallback(new MethodInterceptor() {

    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
    // 前置的业务逻辑操作
    System.out.println("事务已开启");
    /*
    * @param proxy : 当前代理类的一个实例; 若在invoke()方法中调用proxy的非final方法,将造成无限循环调用.
    */
    methodProxy.invoke(service,objects);
    //invoke调用了对象里的方法
    // 调用被代理类的方法,传入参数args,得到返回

    // 后置的业务逻辑操作
    System.out.println("---结束");
    return null;
    }
    });
    UserService proxy=new UserService();
    proxy.delete();
    }


     抽象主题:Subject:接口

     目标对象(原始对象):RealSubject(要增强的对象) implements

     代理对象:Proxy(植入目标对象) 实现了接口

               before code block

               business  xxx.invoke()

               after code block

     动态代理 AOP底层实现:有接口自动应用的就是JDK动态代理

         1)JDK  在运行时运行时注入

              本质:在内存中构建出接口的实现类

              特点:被代理对象,必须有接口

            Proxy.newProxyInstance(ClassLoader loader,

                                              Class<?>[] interfaces,

                                              InvocationHandler h)

            InvocationHandler调度处理器

            public interface InvocationHandler {

            }

            ------------------------Code--------------

            final IUSerDao dao=new UserDaoImpl();

            import java.lang.reflect.Proxy;

            InvocationHandler ih=new InvocationHandler(){

              public Object invoke(Object proxy,Method method,Object[] args){

                  ==================前置===================

                 Object result=method.invoke(dao,args);

                  ==================后置===================

                return result;

              }

              

            };

            IUSerDao proxy=(IUSerDao)Proxy.newProxyInstance(ClassLoader,Interfaces,InvocationHanlder){

            };

            proxy.add();

        

         2)Cglib  底层,注入,编译期已经注入了

               本质:在内存中生成被代理类(目标类)的【子类】

               特点:可以在没有接口的情况下代理

               对于不使用接口的业务类,无法使用JDK动态代理,cglib采用非常底层的字节码技术,可以为一个类创建子类,解 题

          Enhancer xxx=yyy;

          UserDaoImpl proxy=(UserDaoImpl)enhancer.create();

          proxy.add();



  • 相关阅读:
    Git删除不存在对应远程分支的本地分支
    Git删除远程分支
    将博客搬至CSDN
    HttpStatus
    Mysql 日期
    jekyll开发静态网站
    修改maven默认的jdk版本
    使用@Value进行静态常量的值注入
    妙笔生花处,惊艳四座
    Integer 和 int 值比较
  • 原文地址:https://www.cnblogs.com/hualishu/p/7260772.html
Copyright © 2020-2023  润新知