2.SpringIOC思想
2.1 聊聊我们传统的service、dao层
第一步:我们试着写一个简单的例子
- dao层我们写接口和实现类
public interface UserDao {
void getName();
}
public class UserDaoImpl implements UserDao {
@Override
public void getName() {
System.out.println("user对象执行了!");
}
}
- service层我们也写接口和实现类
public interface UserService {
void getName();
}
public class UserServiceImpl implements UserService {
private UserDao userDao=new UserDaoImpl();
@Override
public void getName() {
userDao.getName();
}
}
- 再写一个测试类
public class TestIOC {
public static void main(String[] args) {
UserService userService=new UserServiceImpl();
userService.getName();
}
}
此时我们调用userService的方法由于service层调用了dao层我们会执行getName方法并且输出数据到控制台。
2.2 聊聊改进的方式实现IOC
试想一下,假如我们需要增加一个学生对象呢?
- 我们第一步是需要在dao层写dao学生实现类去实现dao层接口
- 然后还要在service层实现类修改初始化的dao实例对象
- 这样子是不是耦合度太高了呢????
- 我只是在dao新增一个对象,我却要改全局的代码,试想一下如果逻辑业务多,是否是一个耗时耗力,成本十分高的工作呢?
因此我们能不能在service层一次性初始化完,之后我们不论要新增什么对象,都不需要动service层代码,把控制管理权给别人,自己被动调用,在需要的时候直接调用就行。
-
我们于是将直接初始化改成set注入
-
public class UserServiceImpl implements UserService { private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } @Override public void getName() { userDao.getName(); } }
-
再看看现在的实现类写法
-
public static void main(String[] args) { UserServiceImpl userService=new UserServiceImpl(); userService.setUserDao(new StudentDaoImpl()); userService.getName(); }
-
会发现此时我们有新的需求,需要创建新的对象我们不需要再去动service层,而只需要在调用的时候实例化这个对象,并且执行他里面的方法就能获取到数据。
总结:是不是通过set注入减少了开发成本的同时,实现了代码的松耦合呢,将主动权给到用户方,我们并不需要改动原有架构,其实这就是IOC的原型,控制反转