zoukankan      html  css  js  c++  java
  • Spring框架之控制反转IoC(Inversion of Control)的理解

    简单理解:

    控制反转就是将代码的调用权(控制权)从调用方转移给被调用方(服务提供方)。

    解释一下:

    如果我们需要创建某个类,就需要程序员去修改代码,然后才可以得到想要的类。反转的意思就是不需要程序员去直接操作代码,而是通过服务方

    (Spring)让框架的机制帮助程序员获得想要的对象,而程序员只需要修改配置文件,不用关心对象是怎么创建的。

    举个例子:

    1 public class UserServiceImpl implements UserService {
    2     private UserDao userDao = new UserDaoImpl();
    3     @Override
    4     public void getUser() {
    5         userDao.getUser();
    6     }
    7 }

    如果 UserDao 接口被多个不同的类实现,那么在service层就要多次修改标蓝色的代码。

    比如:增加一个 UserDaoMySqlImpl 类去实现 UserDao 接口

    1 public class UserDaoMySqlImpl implements UserDao {
    2     @Override
    3     public void getUser() {
    4         System.out.println("MySql获取用户数据");
    5     }
    6 }

    那么如果在service层需要使用这个类,就要修改代码:

    1 public class UserServiceImpl implements UserService {
    2     private UserDao userDao = new UserDaoMySqlImpl();
    3     @Override
    4     public void getUser() {
    5         userDao.getUser();
    6     }
    7 }

    如果增加一千个类去实现这个接口,那么代码将被程序员修改一千次,这是很不合理的。

    解决方法:

    成员变量是UserDao接口类,但是并不去实现它,给一个实现的方法去实现。

     1 public class UserServiceImpl implements UserService {
     2     private UserDao userDao;
     3     // 利用set实现
     4     public void setUserDao(UserDao userDao) {
     5         this.userDao = userDao;
     6     }
     7     @Override
     8     public void getUser() {
     9         userDao.getUser();
    10     }
    11 }

    这样我们在调用不同的实现类的时候就可以这么写代码:

    1 UserServiceImpl service = new UserServiceImpl();
    2 service.setUserDao( new UserDaoOracleImpl() );

    总结:

    这也是一种反转,本身如果用户需要使用某一个服务类,需要程序员修改内部代码来实现,

    现在程序员只需要给用户提供接口,用户根据需求填入参数就可以得到想要的类。

    之前的主动权在程序,在程序员。

    现在的主动权在调用者,就是调用 setUserDao( )方法的人,

    程序成为了被动者。

    这就是通过定义一个方法,以传参数的形式来返回一个类对象,而不用在类内部初始化另一个类,降低了代码的耦合性。

    控制反转IoC(Inversion of Control),是一种设计思想,DI(Dependency Injection)依赖注入是实现IoC的一种方法。

    反转

    程序和IoC容器的反转

    之前如果程序想要获得某个对象,就直接自己主动去创建,主动权在程序。

    有了IoC容器之后,

    程序获取对象的主动权给了IoC容器,程序成为了被动的接收者,

    只需要等待容器去创建对象并接收,不需要去主动修改代码获得对象。

    Spring容器是如何实现的?

    控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。

    在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Dependency Injection,DI)。

    依赖:程序依赖IoC容器

    注入:IoC容器帮助程序注入到某个对象需要的外部资源(比如给对象的变量赋值)

    参考自:https://blog.csdn.net/jisuanjiguoba/article/details/81532965

        https://www.kuangstudy.com/zl/ssm#1381801414325481474

  • 相关阅读:
    数30的小程序
    convert curl command into java HttpGet
    优秀技术文章转载备份 --- 变速原理
    用 c 调用 win-api 实现自动点击c# winform 程序 的按钮
    win 10 安装 glew 方法
    《想到什么更新什么系列》processing 性能优化
    processing 根据物体移动方向改变朝向
    openFrameworks 无法生成exe已经找不到dll的解决方案
    UE4 无法打开源文件“file_name.generated.h”(Cannot open source file name.generated.h)
    UE4 重新编译老版本的插件
  • 原文地址:https://www.cnblogs.com/rainbow-1/p/15485539.html
Copyright © 2011-2022 走看看