IOC本质
控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法
,也有人认为DI只是IoC的另一种说法。没有IoC的程序中,我们使用面向对象编程,对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方,个人认为控制反转是获得依赖对象的方式反转了。
下面用实例解释IoC
1、创建Maven模块,pom.xml文件引入依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.14</version>
</dependency>
2、创建UserDao接口
public interface UserDao {
void getUser();
}
3、创建UserDaoImpl实例化类UserDao接口
public class UserDaoImpl implements UserDao{
public void getUser() {
System.out.println("获取UserDaoImpl");
}
}
4、创建UserService接口
public interface UserService {
void getUser();
}
5、创建UserServiceImpl实例化类UserService接口
public class UserServiceImpl implements UserService{
private UserDao userDao = new UserDaoImpl();
public void getUser() {
userDao.getUser();
}
}
6、以上是一个简单的测试接口,通过service层调用dao层接口,现在去测试一下,创建一个Test类测试
public class Test {
public static void main(String[] args) {
UserServiceImpl userService = new UserServiceImpl();
userService.getUser();
}
}
测试结果如下:
当用户需求增加时,此时UserServiceImpl类中的对象就需要重新创建一个对象,耦合性很强,这时我们需要在UserServiceImpl类里,写一个set方法,可以动态加载对象,达到解耦效果,代码如下:
public class UserServiceImpl implements UserService{
//private UserDao userDao = new UserDaoImpl();
//将上面代码需改成下面这样
private UserDao userDao
//增加这段代码
public void setUserDao(UserDao userDao){
this.userDao = userDao;
}
public void getUser() {
userDao.getUser();
}
}
7、在dao层多创建一个实现UserDao接口类MySqlDaoImpl
public class MySqlDaoImpl implements UserDao{
public void getUser() {
System.out.println("获取MySqlDaoImpl");
}
}
8、在测试类中调用set方法
public class Test {
public static void main(String[] args) {
UserServiceImpl userService = new UserServiceImpl();
//添加的代码
userService.setUserDao(new MySqlDaoImpl());
userService.getUser();
}
}
测试结果: