3.IOC理论推导

IOC理论推导

以前:

  1. UserDao接口

    package com.faq.dao;
    
    public interface UserDao {
        void getUser();
    }
    
    
  2. UserDaoImpl实现类

    package com.faq.dao;
    
    public class UserDaoImpl implements UserDao{
        public void getUser(){
            System.out.println("默认获取用户的数据");
        }
    }
    
    
    package com.faq.dao;
    
    public class UserDaoMysqlImpl implements UserDao{
        public void getUser() {
            System.out.println("Mysql获取用户数据");
        }
    }
    
  3. UserService业务接口

    package com.faq.service;
    
    public interface UserService {
        void getUser();
    }
    
  4. UserServiceImpl业务实现类

    package com.faq.service;
    
    
    import com.faq.dao.UserDao;
    import com.faq.dao.UserDaoImpl;
    import com.faq.dao.UserDaoMysqlImpl;
    
    //业务层调Dao层
    public class UserServiceImpl implements UserService {
    
        private UserDao userDao=new UserDaoImpl();//组合
        private UserDao userDao1=new UserDaoMysqlImpl();
        public void getUser() {
            userDao1.getUser();
        }
    }
    
  5. 测试类

    import com.faq.dao.UserDao;
    import com.faq.dao.UserDaoImpl;
    import com.faq.service.UserService;
    import com.faq.service.UserServiceImpl;
    
    public class MyTest {
        public static void main(String[] agrs){
            //用户实际调用的是业务层,dao层不需要接触
            UserServiceImpl userService = new UserServiceImpl();
            userService.getUser();
        }
    }
    

再上述的业务中,用户的需求可能会影响我们原来的代码(UserServiceImpl中调用dao层创建不同的对象),我们需要根据用户的需求去修改原代码!程序量巨大时修改成本高

使用set接口实现

public class UserServiceImpl implements UserService {

    private UserDao userDao;

    //利用set进行动态实现值的注入!
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void getUser() {
        userDao.getUser();
    }
}

测试

public class MyTest {
    public static void main(String[] agrs){
        //用户实际调用的是业务层,dao层不需要接触
        UserServiceImpl userService = new UserServiceImpl();
        //userService.setUserDao(new UserDaoMysqlImpl());
         userService.setUserDao(new UserDaoImpl());
        userService.getUser();
    }
}
  • 之前,程序是主动创建对象!控制权在程序猿手上
  • 使用set注入后,程序员不在具有主动性,而是变成被动的接受对象

这种思想,本质上解决了问题,程序员不用再去管理对象的创建。系统耦合性大大降低,可以更专注于业务的实现!这是IOC(控制反转)的原型

上一篇:努力一下,还是可以成为技术美术(TA)的


下一篇:spring学习笔记