AOP前奏

作者: 逗比寨主 | 来源:发表于2019-07-15 18:44 被阅读3次

    AOP前奏 项目Note2

    1.动态代理模式

    动态代理模式:使用一个代理将对象包装起来,然后用该代理对象获取原始对象,任何对原始对象的调用都通过代理,代理对象觉得是否将方法调用转移到原始对象上。

    Java代码:

    AtithmeticCalculator.java

    public interface AtithmeticCalculator {
        int add(int i, int j);
    
        int sub(int i, int j);
    
        int mul(int i, int j);
    
        int div(int i, int j);
    }
    

    AtithmeticCalculatorImpl.java

    public class AtithmeticCalculatorImpl implements AtithmeticCalculator {
        @Override
        public int add(int i, int j) {
            int result = i + j;
            return result;
        }
    
        @Override
        public int sub(int i, int j) {
            int result = i - j;
            return result;
        }
    
        @Override
        public int mul(int i, int j) {
            int result = i * j;
            return result;
        }
    
        @Override
        public int div(int i, int j) {
            int result = i / j;
            return result;
        }
    }
    

    AtithmeticCalculatorLogginProxy.java:代理类

    public class AtithmeticCalculatorLogginProxy {
        private AtithmeticCalculator target;
    
        public AtithmeticCalculatorLogginProxy(AtithmeticCalculator target) {
            this.target = target;
        }
    
        public AtithmeticCalculator getLogginProxy() {
            //代理对象由哪一个加载器负责加载
            ClassLoader loader = target.getClass().getClassLoader();
            //代理对象中有哪些方法
            Class[] interfaces = new Class[]{AtithmeticCalculator.class};
    
            //当代理对象中的方法执行时,执行代码
            InvocationHandler handler = new InvocationHandler() {
                /**
                 *
                 * @param proxy 正在返回的代理对象,在invoke中一般不使用该对象
                 * @param method 调用的方法
                 * @param args 调用的方法使用的呃参数
                 * @return
                 * @throws Throwable
                 */
                @Override
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    System.out.println("The method " + method.getName() + " begins with " + Arrays.asList(args));
                    //执行方法
                    Object result = method.invoke(target, args);
                    System.out.println("The method " + method.getName() + " ends with " + result);
                    return result;
                }
            };
            AtithmeticCalculator proxy = (AtithmeticCalculator) Proxy.newProxyInstance(loader, interfaces, handler);
            return proxy;
        }
    }
    

    简单调用:

    AtithmeticCalculator proxy = (new AtithmeticCalculatorLogginProxy(new AtithmeticCalculatorImpl())).getLogginProxy();
    

    2.什么是AOP?

    1.AOP面向切面编程,OOP是面向对象编程,AOP是对OOP的补充

    2.AOP是切面模块化横切关注点

    3.AOP编程时,仍需要定义公共功能,不不必修改受影响的类。

    3.AOP术语

    Lark20190715181232.png

    1.切面:横切关注点被模块化的特殊对象

    2.通知:切面必须要完成的工作(切面的每一个通知都称之为通知)

    3.目标:被通知的对象

    4.代理:向目标对象应用通知之后创建的对象

    5.连接点:程序执行的某个特定位置:如类某个方法调用前、调用后、方法抛出异常后。

    ​ 连接点有两个信息确定:

    ​ a.方法表示的程序执行点

    ​ b.相对点标识的方位

    ​ 如:

    ​ 连接点为AtithmeticCalculator#add()方法执行前

    ​ 执行点为AtithmeticCalculator#add()

    ​ 方位为该方法执行前的位置。

    6.切点:每个类都拥有多个连接点,AtithmeticCalculator的所有的方法实际上都是连接点,即连接点是客观存在的事物,有实体,AOP通过切点定位到特定的连接点。

    ​ eg:连接点相当于数据库中的记录,切点相当于查询条件

    切点和连接点不是一对一的关系,一个切点匹配多个连接点,切点通过org.springframework.aop.Pointcut接口进行描述,它使用类和方法作为连接点的查询条件。

    相关文章

      网友评论

        本文标题:AOP前奏

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