【Spring】 02- IoC 控制反转(思想)

2. IOC

  • 控制反转IOC(Inversion of Control),是一种设计思想, DI (依赖注入)是实现IOC的一种方式
  • 没有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

    public class UserServiceImpl implements UserService {
    
        private UserDao userDao = new UserDaoImpl();
    
        @Override
        public void getUser() {
            userDao.getUser();
        }
    }
    
  • 测试

    public class MyTest {
        public static void main(String[] args) {
    
            //用户实际调用的是业务层,dao层不需要接触
            UserService userService = new UserServiceImpl();
            userService.getUser();
            
        }
    }
    
  • 结果

    在这里插入图片描述

如果需求发生了变化,需要扩展其他功能, 那么就需要每次修改源代码

  • UserDaoOrecleImpl(新增功能)

    public class UserDaoOracleImpl implements UserDao{
        @Override
        public void getUser() {
            System.out.println("Oracle获取用户数据");
        }
    }
    
  • UserDaoSqlServerImpl(新增功能)

    public class UserDaoSqlServerImpl implements UserDao{
        @Override
        public void getUser() {
            System.out.println("SqlServer获取用户数据");
        }
    }
    
  • 每次修改需求就需要修改Service层源代码:

    public class UserServiceImpl implements UserService{
    	//修改
        private UserDao userDao = new UserDaoSqlServerImpl();
    
        @Override
        public void getUser() {
            userDao.getUser();
        }
    }
    

那么有什么方法可以解决呢?

  • 给service层添加set功能,将控制权交给调用者

    public class UserServiceImpl implements UserService{
    
        private UserDao userDao = new UserDaoImpl();
    
        //利用set动态的实现值的注入
        public void setUserDao(UserDao userDao) {
            this.userDao = userDao;
        }
    
        @Override
        public void getUser() {
            userDao.getUser();
        }
    }
    
  • 那么即可在调用层面上解决频繁修改源代码的问题

    public class MyTest {
        public static void main(String[] args) {
           
            UserService userService = new UserServiceImpl();
            // 传入要使用的新功能类就可以了
            userService.setUserDao(new UserDaoSqlServerImpl());
    
            userService.getUser();
    
        }
    }
    

    或:

      public class MyTest {
          public static void main(String[] args) {
             
              UserService userService = new UserServiceImpl();
              // 传入要使用的新功能类就可以了
              userService.setUserDao(new UserDaoOracleImpl());
      
              userService.getUser();
          }
      }
    
  • 结果

在这里插入图片描述

以上即使IoC的原型

  • 之前,程序是主动创建对象,控制权在程序员手上
  • 使用set注入后,程序不再具有主动性,而变成了被动的接受对象

控制反转(IoC)是一种思想,这种思想,从本质上解决了问题,我们程序员不用再取管理对象的创建了,系统的耦合性大大降低,可以更加专注的在业务的实现上。

控制反转是一种通过描述(xml或注解)并通过第三方去生产或获取特定对象的方式。 在Spring中实现控制反转的是Ioc容器,实现方法是依赖注入(Dependency Injection, DI)。

学习笔记,如有错误,请多多指正!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值