Spring-6aop

2020-03-12  本文已影响0人  RyanHugo

什么是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往回为面向切面编程

上一篇下一篇

猜你喜欢

热点阅读