IOC,AOP

IOC

IOC,也就是控制反转。 比如: A对象里面依赖了一个B对象,也就是我们通常说的在A对象里面实现这个B对象, 也就说说B对象是由A对象控制的。 IOC的意思就是说,将B对象的控制权交给第三方来控制,也就是IOC容器,所以,当对象A运行到需要对象B的时候,IOC容器会主动创建一个对象B注入到对象A需要的地方。

DI 依赖注入

A对象依赖B,我们只需要将B注入A对象就可以了。 IOC是目的,DI是一种手段。 IOC和DI是相辅相成的东西。所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。

IOC的优缺点

第一、软件系统中由于引入了第三方IOC容器,生成对象的步骤变得有些复杂,本来是两者之间的事情,又凭空多出一道手续,所以,我们在刚开始使用IOC框架的时候,会感觉系统变得不太直观。所以,引入了一个全新的框架,就会增加团队成员学习和认识的培训成本,并且在以后的运行维护中,还得让新加入者具备同样的知识体系。

第二、由于IOC容器生成对象是通过反射方式,在运行效率上有一定的损耗。如果你要追求运行效率的话,就必须对此进行权衡。

第三、具体到IOC框架产品(比如:Spring)来讲,需要进行大量的配制工作,比较繁琐,对于一些小的项目而言,客观上也可能加大一些工作成本

第四、IOC框架产品本身的成熟度需要进行评估,如果引入一个不成熟的IOC框架产品,那么会影响到整个项目,所以这也是一个隐性的风险。

OC 的思想最核心的地方在于,资源不由使用资源的双方管理,而由不使用资源的第三方管理。

    第一,资源集中管理,实现资源的可配置和易管理

    第二,降低了使用资源双方的依赖程度,也就是我们说的耦合度

AOP

面向切面编程,AOP实际上是由OOP演变过来。 比如, 每个接口都需要鉴权逻辑,正常的思路就是在需要鉴权或者打日志的地方切一刀就可以了,把需要复用的逻辑填进去。这个过程一般就是通过di实现的。

同现实中“代理”一词的意思相同:比如我要去买保险,要调用的关键方法只有一个:传入人民 币,拿到保单;但这其中还有很多跟我关注的核心方法无关的动作执行,如填写资料表,审核资料, 提交证明. . . 与是,我通过一个保险代理人来买保险—通过代理对象执行我需要的调用----我就 可专注于自己想要的东东了。
调用一个对象的方法时,可通这调用这个对象的“代理对象“执行,如果某些方法要日志记录 , 事务管理,审计…,就只需修改代理类中的方法,而不必修改对象“原类”中的代码。要实现这一功 能,必须先编写一个通用的代理类,

代码实现:

public class DebugVehicleProxy implements InvocationHandler {

    public DebugVehicleProxy(Object obj) {
        this.obj = obj;
    }

    //被代理对象
    private Object obj;

    //得到代理对象
    public static Object getProxy(Object obj) {
        System.out.println("getProxy被调用了");
        return java.lang.reflect.Proxy.newProxyInstance(obj.getClass() .getClassLoader(),
                obj.getClass().getInterfaces(),
                new DebugVehicleProxy(obj));
    }


/**
 * 实现InvocationHandler中的方法
 * 被代理类调用时,实际上是通过这个方法调用的 * @param proxy:被调用方法的对象
 * @param method:要调用的方法对象
 * @param args:调用方法的参数列表
 */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) {
        System.out.println("invoke被调用了");
        Object result = null;
        try {
            System.out.println("debug advice begin:" + method.getName());
            result = method.invoke(obj,args);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        finally {
            System.out.println("debug advice finash:" + method.getName());
        }
        return result;
    }
}


//测试

public class Driver {
    public static void main(String[] args) {
        IVehicle iVehicle = new BMW();
        //代理前执行:
        iVehicle.forward(100);
        //通过代理对象执行
        IVehicle vehicle = (IVehicle) DebugVehicleProxy.getProxy(iVehicle);
        vehicle.forward(200);

    }
}

版权声明:本文为weixin_47285644原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。