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);
}
}