传统架构的思想
业务层调用dao层来实现,dao调用dao的实现类来实现功能,代码结构如下:
ObjectDao.java
package com.hhx.dao;
/**
* @author 黄河祥
* @create 2020/2/20 23:18
*/
public interface ObjectDao {
void getObject();
}
ObjectDaoImpl.java
package com.hhx.dao;
/**
* @author 黄河祥
* @create 2020/2/20 23:18
*/
public class UserDaoImpl implements ObjectDao {
public void getObject() {
System.out.println("获取到user用户了");
}
}
ObjectService.java
package com.hhx.service;
/**
* @author 黄河祥
* @create 2020/2/20 23:20
*/
public interface ObjectService {
void getObject();
}
ObjectServiceImpl.java
package com.hhx.service;
import com.hhx.dao.ObjectDao;
import com.hhx.dao.UserDaoImpl;
/**
* @author 黄河祥
* @create 2020/2/20 23:23
*/
public class ObjectServiceImpl implements ObjectService {
private ObjectDao objectDao = new UserDaoImpl();
public void getObject() {
objectDao.getObject();
}
}
注意:以上这里是关键点了!
先运行一下测试类
public class MyTest {
public static void main(String[] args) {
ObjectService objectService = new ObjectServiceImpl();
objectService.getObject();
}
}
运行结果:
试想一下这样一个情况,现在我们通过一个UserDao的实现类,得到到User对象了,某一天出现了新的需求,我们需要一个Car的实现类,来得到car对象,则我们必须要修改源代码,需要修改ObjectServiceImpl.java下的代码。
CarImpl.java代码如下:
package com.hhx.dao;
/**
* @author 黄河祥
* @create 2020/2/20 23:53
*/
public class CarImpl implements ObjectDao {
public void getObject() {
System.out.println("得到car对象了");
}
}
修改一两个还好,可是要是又有需求来要得到一个Dog对象,Train对象…,则在这个上面花费的人力和财力将是极其浪费的,也是没有必要的,故因此我们只需要在如下地方做变动,把ObjectServiceImpl.java中的ObjectDao 生成一个Setter方法。
package com.hhx.service;
import com.hhx.dao.CarImpl;
import com.hhx.dao.ObjectDao;
import com.hhx.dao.UserDaoImpl;
/**
* @author 黄河祥
* @create 2020/2/20 23:23
*/
public class ObjectServiceImpl implements ObjectService {
private ObjectDao objectDao;
//通过set实现动态的注入
public void setObjectDao(ObjectDao objectDao) {
this.objectDao = objectDao;
}
public void getObject() {
objectDao.getObject();
}
}
之前,程序员主动创建对象,控制权在程序员手上,使用set注入后,程序不再具有主动性,而是变成了被动的接收对象,这样一来,以后每需要扩充实现类的时候,只需要传递实现类的对象就可以了,原本的代码则因此不需要修改,这就是IOC的思想。
package com.hhx;
import com.hhx.dao.CarImpl;
import com.hhx.dao.UserDaoImpl;
import com.hhx.service.ObjectService;
import com.hhx.service.ObjectServiceImpl;
/**
* @author 黄河祥
* @create 2020/2/20 23:27
*/
public class MyTest {
public static void main(String[] args) {
ObjectService objectService = new ObjectServiceImpl();
((ObjectServiceImpl)objectService).setObjectDao(new CarImpl());//传递要实例化的实现类
((ObjectServiceImpl)objectService).setObjectDao(new UserDaoImpl());
objectService.getObject();
}
}