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();

    }
}