Spring IOC与AOP

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liyaohui_szz/article/details/81228224

      使用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"); 
    } 
} 

猜你喜欢

转载自blog.csdn.net/liyaohui_szz/article/details/81228224