美文网首页
SpringAOP-jdk动态代理

SpringAOP-jdk动态代理

作者: 墨平语凡 | 来源:发表于2018-06-30 09:35 被阅读0次

    静态代理与动态代理

    • 静态代理(如SpringAOP-代理模式中所示)的缺点
      代理目标的方法越多,代理所委托的方法就越多,而且可能所织入的逻辑很多是一样的,这样就会造成大量重复
    • 动态代理的两类实现:基于接口代理与基于继承代理
    • 两类动态代理实现的代表:JDK代理与Cglib代理

    JDK实现要点

    • 类:java.lang.reflect.Proxy
    • 接口:InvocationHandler
    • 只能基于接口进行动态代理
    public class JdkProxySubject implements InvocationHandler{
    // 引用目标对象
        private RealSubject realSubject;
    // 通过构造器注入目标对象
        public JdkProxySubject(RealSubject realSubject) {
            this.realSubject = realSubject;
        }
    // 执行动态代理的逻辑
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("before");
            Object result = null;
            try{
    // 通过方法反射,传递参数
                result = method.invoke(realSubject,args);
            }catch (Exception e){
                System.out.println("ex:"+e.getMessage());
                throw e;
            }finally {
                System.out.println("after");
            }
            return result;
        }
    }
    

    客户端代码:

    public class Client {
    
        public static void main(String[] args){
            System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
            Subject subject = (Subject) Proxy.newProxyInstance(Client.class.getClassLoader(),new Class[]{Subject.class},new JdkProxySubject(new RealSubject()));
            subject.hello();
        }
    }
    

    相关文章

      网友评论

          本文标题:SpringAOP-jdk动态代理

          本文链接:https://www.haomeiwen.com/subject/exftuftx.html