Spring笔记之IOC | 青训营笔记

67 阅读2分钟

Spring之IOC

要理解IOC的作用和意义,首先需要理解没有IOC的代码开发有哪些问题 以下面的代码为例

//业务层
public class BookServiceImpl implements BookService{
    private BookDao bookDao = new BookDaoImpl();
    public void save(){
        bookDao.save();
    }
}
//数据层
public class BookDaoImpl implements BookDao{
    public void save(){
        System.out.println("book dao save ...");
    }
}

业务层需要调用数据层的方法,所以在业务层new了一个数据层的对象。

假如此时我们需要进行代码更新,创建了新的数据层的实现类

//数据层
public class BookDaoImpl2 implements BookDao{
    public void save(){
        System.out.println("book dao save ...2");
    }
}

那么此时,如果业务层的new方法不更改的话就会报错,因此我们就需要业务层更改new BookDaoImpl2()。从这里可以看出代码存在的问题是耦合度过高。

为了解决这类问题,spring的IOC提供了方案 IOC(Inversion of Control)控制反转:使用对象时,由主动new产生对象转换为由外部提供对象,对象的创建控制权由程序转移到外部。

案例演示

为了理解spring的IOC实现方式,用如下一个示例来进行说明。 创建业务层和数据层的接口和实现类

public interface BookDao {
    public void save();
}
public class BookDaoImpl implements BookDao{
    public void save(){
        System.out.println("book dao save...");
    }
}
public interface BookService{
    public void save();
}
public class BookServiceImpl implements BookService{
    private BookDao bookDao = new BookDaoImpl();
    public void save(){
        System.out.println("book service save...");
        bookDao.save();
    }
}

然后在配置文件中要注册bean,可以理解为注册bean就是要告诉spring,我们要将类的对象实例交给spring来管理。

..........
<bean id="bookDao" class="com.xxx.xxx.xxx.BookDaoImpl"/>
<bean id="bookService" class="com.xxx.xxx.xxx.BookServiceImpl"/>
..........

通过xml的配置,我们就告诉了springBookDaoImplBookServiceImpl这两个类由spring来进行管理。

完成相关配置之后,我们就可以直接调用了。

public class App{
    public static void main(String[] args){
        ApplicationContext ctx = new ClassPathXmlApplicationContext("XXXX.xml");//导入配置文件
        BookDao booDao = (BookDao) ctx.getBean("bookDao");
        bookDao.save();
    }
}

测试结果 book dao save...

可以看出,通过注册spring的bean,实现了不使用new方法,spring自动为我们创建了实例。

到这里还没有完全解决我们上面提到的耦合问题,因为BookService依赖于BookDao类,所以仍然存在new方法,要完全解决这个问题就要用到另一个思想DI(依赖注入)。

未完待续。。。。

注:本人理解可能不够到位,代码内容也不完整,bean的实现是比较早期的方式,现在有注解的方式用来实现,不需要xml配置,本文的目的主要是为了自己记笔记。。。。