Spring IOC(DI) 和 AOP
Spring中IOC和AOP可以说是最为基础也最为重要的设计思想了,但是不是只有Spring才有这种设计,其他很多的编程语言也有类似的设计。IOC和AOP是一种设计思想而Spring中的IOC和AOP是一种具体的实现,类似于接口和实现类的关系,接下来如果明确特指本文中的IOC和AOP都是指Spring中的IOC和AOP
我们简单看一下百度对于这两者的解释
IOC
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
简单总结一下IOC的作用就是降低代码之间的耦合程度,而在Spring中大多使用了依赖注入,依赖查找使用较少。
在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
个人理解结合百科内容总结如下:AOP主要是在程序运行期间对程序进行进行修改和增强的技术。接下来针对这两个技术分别进行介绍
spring ioc
这里结合一个例子对SpringIOC进行介绍,首先看一下Car对象(对象内容进行简写处理,详细代码看末尾)
public class Car {
private Enginee enginee;
private Gear gear;
public Car(Enginee enginee, Gear gear) {
this.enginee = enginee;
this.gear = gear;
}
}
其中成员变量Enginee和Gear定义如下
public class Enginee {
private String name;
public Enginee(String name) {
this.name = name;
}
}
public class Gear {
private String name;
public Gear(String name) {
this.name = name;
}
}
因此如果想要使用Car变量,我们首先需要手动创建成员对象的实例,过程如下
public String test(){
//创建对象
Enginee enginee=new Enginee("红旗");
Gear gear=new Gear("橡胶");
Car car=new Car(enginee,gear);
System.out.println(car.toString());
return car.toString();
}
但是我们转念一想,Car
对象虽然使用了Enginee
和Gear
对象,但是为什么具体在使用中需要和成员对象实例化过程绑定在一起呢?简单来说作为一个汽车生产商,他只需要关注汽车的外形和内部设计,而不应该关心引擎和轮胎是怎么生产的。逻辑上是这个道理,那我们要怎么做呢?
具体的实验过程可以有很多种,你可以自己创建Map数据结构保持类与实例的映射关系。当然你也可以选择Spring。通过使用@Component
注解,我们可以将上述逻辑修改如下
@Autowired
private Car car;
public String test1(){
//核心功能
System.out.println(car.toString());
return car.toString();
}
是不是一下子变得简单多了?Spring就是这样,可以帮我们减少大量逻辑无关的代码。
简单总结一下,Spring IOC的优点如下
- 不必要关心成员对象的创建方式
- 减少业务逻辑无关代码
- 减少代码的耦合
spring AOP
AOP一般称之为AOP面向切面编程,具体使用了Java中的动态代理和字节码增强技术(JVM相关)。可能初见觉得切面这个词很抽象,那么我也按照上面一样,通过一个例子来解释一下AOP。
这里举一个银行卡与手机短信的例子,大家现在可能每次银行卡进账或者消费都会发短信进行提示。但是银行卡的使用本身却不需要借助短信功能,而是短信发送功能监视了银行卡的使用。这里银行卡的使用就是切面,是一个过程或者行为,而发短信就需要监视某个特定行为来执行不同的操作,也就是面向切面编程。短信功能本身不会干涉银行卡的使用,但是可以针对银行卡的使用提供更好的体验,因此面向切面编程可以丰富或者增强原有的功能实现。具体使用中,日志系统就是典型的面向切面编程设计。
IOC例子地址:https://github.com/charmerares/Spring-Introduction.git