IOC控制反转
IOC控制反转
在传统的JavaSE中,直接在类的内部通过new关键字来创建对象的实例,是程序主动去创建依赖对象.
而IOC有一个专门的容器,来创建这些对象,由IOC容器来控制对象的创建,依赖对象也是容器帮忙查找创建并进行注入,对象只是被动的接受,依赖对象的获取被反转了。
例如:在Dao层有UserDaoImpl实现类和UserDao接口;在Service层有UserService接口和UserServiceImpl实现类;
在UserServiceImpl中通过将UserDao的设置交给用户,从而让对象的控制权交给用户
dao
UserDao
package com.jiwei.dao;
public interface UserDao {
public void getUser();
}
UserDaoImpl
package com.jiwei.dao;
public class UserDaoImpl implements UserDao {
public void getUser(){
System.out.println("doUserDaoImpl");
}
}
UserDaoMySQLImpl
package com.jiwei.dao;
public class UserDaoMySQLImpl implements UserDao{
public void getUser(){
System.out.println("MySQL");
}
}
UserDaoSQLServerImpl
package com.jiwei.dao;
public class UserDaoSQLServerImpl implements UserDao {
public void getUser(){
System.out.println("SQL Server");
}
}
三个不同的实现类表示不同的需求
service
package com.jiwei.service;
public interface UserService {
public void getUser();
}
UserServiceImpl
package com.jiwei.service;
import com.jiwei.dao.UserDao;
public class UserServiceImpl implements UserService {
// UserDao userDao = new UserDaoSQLServerImpl(); // 写的太死了
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void getUser(){
userDao.getUser();
}
}
从new到set,控制反转
Test
import com.jiwei.dao.UserDaoImpl;
import com.jiwei.service.UserServiceImpl;
public class MyTest {
public static void main(String[] args) {
UserServiceImpl userService = new UserServiceImpl();
// userService.setUserDao(new UserDaoSQLServerImpl());
// userService.setUserDao(new UserDaoMySQLImpl());
userService.setUserDao(new UserDaoImpl());
// 彻底实现控制权交给用户
// 通过set方法,让用户来决定你要什么类
userService.getUser();
}
}