• 003 代理工厂


    一. 概述

      之前我们介绍了AOP的实现依赖于动态代理,再深一点说,就是创建出一个代理对象才能完成AOP的实现.

        因此,我们就能知道了,AOP的核心首要就是创建出动态代理对象.


    二 . 前置说明

      AOP在spring之中的表现形式是相当多的,如之前的IOC形式,Aspectj的风格,各种xml的形式,(包括,tx,task等命名空间),如果我们从这里入手学习AOP的话,

        我们会发现内容实在太多了,而且根本找不到入手点.

      在概述之中,我们说到,AOP的一个核心就是创建出动态代理对象,因此我们只要掌握了动态代理对象的生成过程,我们就能知道各种配置方式到底是在做什么东西.


    三 . 代理工厂

      spring为我们提供了一个代理对象的工厂,我们通过这个工厂可以创建出代理对象.

      下面简单的演示一下这个代理工厂的使用.

    public interface Subject {
        
        void  exec();
    }
    public class RealSubject implements Subject{
    
        @Override
        public void exec() {
            System.out.println("real subject");
        }
        
    }
    public class ExecBeforeAdvice implements MethodBeforeAdvice{
    
        @Override
        public void before(Method method, Object[] args, Object target) throws Throwable {
            //几个参数都十分好理解
            /**
             * method : 目标对象的方法
             * args : 方法的参数
             * target : 目标对象
             */
            System.out.println("before");
        }
    
    }

    此处我们使用了前置通知的增强方式.

        public static void main(String[] args) {
            //创建目标对象
            Subject subject = new RealSubject();
            //创建代理工厂
            ProxyFactory factory = new ProxyFactory();
            //设置目标对象
            factory.setTarget(subject);
            //设置通知对象
            factory.addAdvice(new ExecBeforeAdvice());
            //从工厂之中获取代理对象
            Subject proxy = (Subject)factory.getProxy();
            //调用代理对象的方法
            proxy.exec();
        }

    上面是测试代码,我们发现我们生成了一个代理对象.


    四 .总结

      当我们使用jdk动态代理或者cglib的时候,我们的代码量是十分大的.

      但是当我们使用ProxyFactory创建代理对象的时候,过程变得十分简单了.

      注意: 我们使用ProxyFactory创建代理对象的过程是属于编程式的,而spring同时也提供了配置式的方式.

      下一节,我们说一下配置式的使用.

  • 相关阅读:
    68
    56
    Django manager 命令笔记
    Django 执行 manage 命令方式
    Django 连接 Mysql (8.0.16) 失败
    Python django 安装 mysqlclient 失败
    H.264 SODB RBSP EBSP的区别
    FFmpeg—— Bitstream Filters 作用
    MySQL 远程连接问题 (Windows Server)
    MySQL 笔记
  • 原文地址:https://www.cnblogs.com/trekxu/p/9097241.html
Copyright © 2020-2023  润新知