使用spring这么久了,从来没好好的总结一下这两个核心的技术,关于这两个技术的资料数不胜数,自己也看过一些书、查过一些资料,不过可能由于个人水平有限,总是弄的混混恶恶的,因此今天抽空总结一下。
1、IOC
先从IOC说起,我们平常使用对象的时候,一般都是直接使用关键字类new一个对象,使用new那么就表示当前模块已经不知不觉的和new的对象耦合了。而我们通常都是更高层次的抽象模块调用底层的实现模块,这样也就产生了模块依赖于具体的实现,这样与我们JAVA中提倡的面向接口面向抽象编程是相冲突的。例如:我们在进行数据库操作的时候,总是业务层调用DAO层,当然我们的DAO一般都是会采用接口开发,这在一定程度上满足了松耦合,使业务逻辑层不依赖于具体的数据库DAO层。(但是我们在使用的时候还是会new一个特定数据库的DAO层,这无形中也与特定的数据库绑定了)
IOC,就是DAO接口的实现不再是业务逻辑层调用工厂类去获取,而是通过容器(比如spring)来自动的为我们的业务层设置DAO的实现类。这样整个过程就反过来,以前是我们业务层主动去获取DAO,而现在是DAO主动被设置到业务逻辑层中来了,这也就是反转控制的由来。
2、AOP
举个例子:当一个类中有5个方法,调用每个方法之前都要检查用户是否具有权限,我们可以定义一个公共方法A,5个方法中每个方法都调用该公共方法A。如果类中有100个方法,每次调用固然很麻烦,如果哪天需求变了,不需要呢,一个个去掉吗,更费劲。
AOP 的底层实际上是由动态代理实现的。AOP 代理其实是由 AOP 框架动态生成的一个代理对象,该对象可作为目标对象使用。AOP 代理对象包含了目标对象的全部方法,同时又添加了特殊的处理方法,如上面说的检查权限之类的操作。所以,是在原目标对象上添加了特殊功能。
最最经典的实例===
定义一个接口:
public interface IHello {
void sayHello(String name);
}
写个类实现IHello接口
public class Hello implements IHello {
public void sayHello(String name) {
System.out.println("Hello " + name);
}
}
现在我们要为这个业务方法加上日志记录的业务,我们在不改变原代码的情况下,我们会去怎么做呢?也许,你会去写一个类去实现IHello接口,并依赖Hello这个类.代码如下:
public class HelloProxy implements IHello {
private IHello hello;
public HelloProxy(IHello hello) {
this.hello = hello;
}
public void sayHello(String name) {
Logger.logging(Level.DEBUGE, "sayHello method start.");
hello.sayHello(name);
Logger.logging(Level.INFO, "sayHello method end!");
}
}
.Logger类和Level枚举代码如下:
Logger.java
import java.util.Date;
public class Logger{
public static void logging(Level level, String context) {
if (level.equals(Level.INFO)) {
System.out.println(new Date().toLocaleString() + " " + context);
}
if (level.equals(Level.DEBUGE)) {
System.err.println(new Date() + " " + context);
}
}
}
Level.java
public enum Level {
INFO,DEBUGE;
}
测试:
public class Test {
public static void main(String[] args) {
IHello hello = new HelloProxy(new Hello());
hello.sayHello("Doublej");
}
}
hello对象是被HelloProxy这个所谓的代理态所创建的.这样,如果我们以后要把日志记录的功能去掉.那我们只要把得到hello对象的代码改成以下:
public class Test {
public static void main(String[] args) {
IHello hello = new Hello();
hello.sayHello("Doublej");
}
}