Skip to content

要想解答这个问题,就需要先分析下目前咱们代码在编写过程中遇到的问题

在编写过程中遇到的问题

  • 1.业务层需要调用数据层的方法,就需要在业务层new数据层的对象

  • 2.如果数据层的实现类发生变化,那么业务层的代码也需要跟着改变,发生变更后,都需要进行编译打包和重部署

  • 3.所以,现在代码在编写的过程中存在的问题是:耦合度偏高

针对这个问题,该如何解决呢?

原始代码-业务层实现

js
public class BookServlet extends BookServlet {
    //这个地方是写死了的
    private BookDao bookDao = new BookDaoImpl();
    public void save() {
        bookDao.save();
    }
}

原始代码-数据层实现

如果当我们想换一个数据层的实现(假如BookDaoImpl2比BookDaoImpl1好用),那么业务层的代码也得跟着变,耦合度太高了

js
public class BookDaoImpl1 implements BookDao {
    public void save() {
        System.out.println("book dao save ... 1");
    }
}
public class BookDaoImpl2 implements BookDao {
    public void save() {
        System.out.println("book dao save ... 2");
    }
}

我们就想,如果不new对象,只声明一下,不就可以降低依赖了吗,但是又会引入新的问题,去掉以后程序能运行吗?

答案显然是不行的,因为bookDao没有赋值为Null,强行运行就会出空指针异常。

所以现在的问题就是,业务层不想new对象,运行的时候又需要这个对象,该咋办呢?

针对这个问题,Spring就提出了一个解决方案:

  • 使用对象时,在程序中不要主动使用new产生对象,转换为由外部提供对象
  • 这种实现思就是Spring的一个核心概念