IOC思想
在接触spring之前,我们原来的项目中 ,每次用户想要一些其他的功能,我们就要通过改变原来的代码来实现,当代码量比较大的时候,修改代价非常昂贵。因此IOC思想就出来了。它的本质就是:获得依赖对象的方式反转了。
跟以前的项目进行对比:
以前的项目:
Dao层
public interface UserDao {
void getUser();
}
Dao层实现类DaoImpl
public class UserDaoImpl implements UserDao{
public void getUser() {
System.out.println("默认用户");
}
}
Service层
public interface UserService {
void getUser();
}
Service层实现类ServiceImpl
public class UserServiceImpl implements UserService{
//用户每次增加需求都要改变代码
private UserDao userDao = new UserDaoImpl();
public void getUser() {
userDao.getUser();
}
}
测试类(用户)
public class MyTest {
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
userService.getUser();
}
}
结果:输出“默认用户”
那么问题来了,用户想要增加一些其他的功能。
按照以前的思想,我们要重新添加一个dao接口和实现类还要对service层也进行大改,这样改动是违反了开闭原则的。好的程序是在不动原来代码的基础上对其进行一定的修改,那么我们上面项目的那种方式就被摒弃了,我们会采用一个setUserDao的方法动态实现值的注入。
利用了IOC思想的新项目:
新增了一个Mysql用户的功能,想要实现把原来的默认用户与mysql用户自由切换。
新的ServiceImpl
public class UserServiceImpl implements UserService{
//用户每次增加需求都要改变代码
private UserDao userDao ;
public void getUser() {
userDao.getUser();
}
//重点:利用set进行动态实现值的注入
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
写了上面的setUserDao的方法后呢,我们就不用每次改Service层的代码,直接在测试类里调用这个方法,传一个对象过来就可以了。
新的测试类
public class MyTest {
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
//需要强转才能调用,因为setUserDao方法是在UserServiceImpl中,需要它的对象才能调用,简化后是下方aaa处代码
((UserServiceImpl)userService).setUserDao(new UserDaoMySQLImpl());
userService.getUser();
//aaa
/*UserServiceImpl userService1 = new UserServiceImpl();
userService1.setUserDao(new UserDaoMySQLImpl());*/
}
}
测试结果:
这样,我们可以直接通过setUserDao的方法里传不同的dao层实现类的对象来实现对应不同dao层对象的不同的功能,所以说以后添加功能时只需要写dao层和测试类就可以,减少了对service层的改动。
根据代码我们可以看出:
之前,所有的对象都需要程序员手动创建,而加入set的动态值注入后,程序被动的接受对象。控制权从程序员自己变成了用户,用户需要什么样的需求,我们可以通过IOC思想很快完成。这就是IOC的思想,跟策略模式有些类似。这只是简单的思想理解,具体应用肯定不止于此的,希望通过这篇博客,我们刚学习spring的小白能够对IOC思想有一个简单的理解。