Spring IoC与DI

Inversion of Control (IoC)

A bean is an object that is instantiated, assembled, and managed by a Spring IoC container. Otherwise, a bean is simply one of many objects in your application.

翻译:bean是一个由Spring IoC容器实例化、组装和管理的对象。

与传统控制对象不同,对象由Spring IoC容器控制,而不由我们控制,所以称为控制反转。

Dependency Injection (DI)

Dependency injection (DI) is a process whereby objects define their dependencies (that is, the other objects with which they work) only through constructor arguments, arguments to a factory method, or properties that are set on the object instance after it is constructed or returned from a factory method.

翻译:依赖注入(DI)是对象只能通过构造器参数工厂方法参数或者在属性已经被构造或工厂方法返回后在对象实例上设置的属性来定义他的依赖(依赖是指与他一起运作的其它的对象)的过程

通过官方文档原话我们可以得到以下有用的信息:

  1. 依赖:与他一起运作的对象被称为依赖。
    比如Person类将Dog类对象作为属性,那么Person类的创建将依赖Dog类。
  2. 注入:三种注入方式:
    1. 构造器
    2. 工厂方法
    3. 对象实例属性

IoC与DI关系

IoC is also known as dependency injection (DI).

翻译:IoC作为依赖注入(DI)所被熟知

为什么Spring能解偶

通过下面例子来讲解

这是Spring项目目录结构

src
├── main
│   ├── java
│   │   └── cn
│   │       └── arrayblog
│   │           └── pojo
│   │               └── Hello.java
│   └── resources
│       └── beans.xml
└── test
    ├── java
    │   └── HelloTest.java
    └── resources

共包含Hello.javabeans.xmlHelloTest.java三个文件

Hello.java:bean
beans.xml:定义bean对象
HelloTest.java:创建bean对象

传统方式,仅Hello.javaHelloTest.java便能创建bean对象,属性赋值需要通过构造器、set方法或者工厂方法手动赋值。

如果使用Spring,那么你需要beans.xml来定义对象,HelloTest.java会根据beans.xml的内容所指定Hello.java来创建bean对象,并对其属性自动赋值。

Q&A

Spring使得bean对象创建更复杂了吗?

  • beans.xml文件的引入使项目结构变得复杂
  • bean对象创建变得简单,因为属性自动赋值
  • bean对象易于管理,因为都被存在beans.xml

Spring如何做到解偶?

Spring通过beans.xml来降低了对象类使用该对象类创建对象的类的耦合度。

举个例子

不使用Spring,当我们手动创建一个对象类使用该对象类创建对象的类,假设我们需要对使用该对象类创建对象的类进行关于对象类属性值的修改,那我们需要重新编译两个文件。

使用Spring,由于beans.xml不参与编译的原因,上述情况就可以通过修改beans.xml内容来解决。

原文地址:https://www.cnblogs.com/arrayblog/p/13866219.html