美文网首页
Spring-6aop

Spring-6aop

作者: RyanHugo | 来源:发表于2020-03-12 21:51 被阅读0次

    什么是AOP?为什么需要AOP

    需求

    image.png
    image.png

    代码实现片段

    image.png

    问题

    1.代码混乱

    越来越多的非业务需求(日志和验证等)加入后, 原有的业务方法急剧膨胀.
    每个方法在处理核心逻辑的同时还必须兼顾其他多个关注点.

    2.代码分散

    以日志需求为例, 只是为了满足这个单一需求, 就不得不在多个模块(方法)
    里多次重复相同的日志代码. 如果日志需求发生变化, 必须修改所有模块.

    使用动态代理解决上述问题

    代理设计模式的原理: 使用一个代理将对象包装起来, 然后用该代理对象取代原始对象.
    任何对原始对象的调用都要通过代理. 代理对象决定是否以及何时将方法调用转到原始对象上.

    使用动态代理

    接口

    public interface Calculator {
        int add(int i,int j);
    }
    

    实现类

    public class CalculatorImpl implements Calculator{
    
        @Override
        public int add(int i, int j) {
            // TODO Auto-generated method stub
            return i+j;
        }
    }
    

    代理类

    public class ProxyLogCalculator {
    
        private Calculator target;
        
        public ProxyLogCalculator(Calculator target) {
            // TODO Auto-generated constructor stub
            this.target = target;
        }
        
        public Calculator getLogProxy(){
            Calculator proxy = null;
            
    //      代理对象由哪个类加载器负责
            ClassLoader loader = target.getClass().getClassLoader();
    //      代理对象的类型,即其中有哪些方法
            Class[] interfaces = target.getClass().getInterfaces();
    //      调用代理对象其中的方法
            InvocationHandler h = new InvocationHandler() {
                
                @Override
                public Object invoke(Object proxy, Method method, Object[] args)
                        throws Throwable {
                    // TODO Auto-generated method stub
                    System.out.println("before method");
                    Object result = method.invoke(target, args);
                    System.out.println("after method");
                    return result;
                }
            };
            
            proxy = (Calculator) Proxy.newProxyInstance(loader, interfaces, h);
            return proxy;
            
        }
        
        public static void main(String[] args) {
            Calculator calculator = new CalculatorImpl();
            Calculator proxy = new ProxyLogCalculator(calculator).getLogProxy();
            System.out.println(proxy.add(1, 4));
        }
    }
    

    AOP

    1.AOP(Aspect-Oriented Programming, 面向切面编程): 是一种新的方法论,
    是对传统 OOP(Object-Oriented Programming, 面向对象编程) 的补充.
    2.AOP 的主要编程对象是切面(aspect), 而切面模块化横切关注点.
    3.在应用 AOP 编程时, 仍然需要定义公共功能, 但可以明确的定义这个功能
    在哪里, 以什么方式应用, 并且不必修改受影响的类. 这样一来横切关注点就
    被模块化到特殊的对象(切面)里.
    4.AOP 的好处:
    每个事物逻辑位于一个位置, 代码不分散, 便于维护和升级
    业务模块更简洁, 只包含核心业务代码.


    image.png

    1.横切关注点是指(不划分功能)3个:验证参数,前置日志、后置日志
    2.切面(按照功能划分)2个:(日志模块:前置日志、后置日志)(验证模块:验证参数)
    3.从上往下拆分功能称为:抽取横切关注点,AOP往回为面向切面编程

    相关文章

      网友评论

          本文标题:Spring-6aop

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