要想解答这个问题,就需要先分析下目前咱们代码在编写过程中遇到的问题
在编写过程中遇到的问题
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的一个核心概念