IoC基础
先写个UserDao接口
public interface UserDao {
void getUser();
}
UserDaoImpl
public class UserDaoImpl implements UserDao{
@Override
public void getUser() {
System.out.println("获取用户");
}
}
UserService
public interface UserService {
void getUser();
}
UserServiceImpl
import com.wx.dao.UserDao;
import com.wx.dao.UserDaoImpl;
public class UserServiceImpl implements UserService{
private UserDao userDao = new UserDaoImpl();
@Override
public void getUser() {
userDao.getUser();
}
}
测试
import com.wx.service.UserService;
import com.wx.service.UserServiceImpl;
public class MyTest {
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
userService.getUser();
}
}
但如我们增加一个用户接口实现类
public class UserDaoMysql implements UserDao{
@Override
public void getUser() {
System.out.println("mysql获取用户");
}
}
如果我们要使用这个接口实现类的花,我们就需要去service里修改代码
package com.wx.service;
import com.wx.dao.UserDao;
import com.wx.dao.UserDaoImpl;
import com.wx.dao.UserDaoMysql;
public class UserServiceImpl implements UserService{
private UserDao userDao = new UserDaoMysql();
@Override
public void getUser() {
userDao.getUser();
}
}
如果我们再继续加接口实现类,那么又要对应地去修改service实现类里面的代码,如果这种需求非常大,那么就要修改大量的代码,这种设计耦合性太高了。
解决:
我们可以在需要用到他的地方 , 不去实现它 , 而是留出一个接口 , 利用set , 我们去代码里修改下 .
package com.wx.service;
import com.wx.dao.UserDao;
import com.wx.dao.UserDaoImpl;
import com.wx.dao.UserDaoMysql;
public class UserServiceImpl implements UserService{
private UserDao userDao ;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void getUser() {
userDao.getUser();
}
}
import com.wx.dao.UserDaoImpl;
import com.wx.dao.UserDaoMysql;
import com.wx.service.UserService;
import com.wx.service.UserServiceImpl;
public class MyTest {
public static void main(String[] args) {
UserServiceImpl userService = new UserServiceImpl();
userService.setUserDao(new UserDaoMysql());
userService.getUser();
}
}
这样我们就可以通过使用setUserDao来实现不同的接口实现类,这样就解决了问题,降低了耦合性,这也就是IoC的原型
IoC本质
控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,也有人认为DI只是IoC的另一种说法。没有IoC的程序中 , 我们使用面向对象编程 , 对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方
控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现
控制反转的是IoC容器,其实现方法是依赖注入(Dependency Injection,DI)。