关于DI的理解

来源:1-1 IOC与DI的理解

哆丶哆

2019-08-03 02:59:16

老师,课程中讲到的对DI(依赖注入)的理解,我还是有点模糊,到底DI是怎么利用了反射机制的啊,我之前编程的时候也没在意哪里体现了反射,就知道可以这么写。

写回答

1回答

笛子

2019-08-03

要解释DI我先讲一下DI技术的前置技术——反射。

我们以`com.imooc.di.entity.Person`为例。

# 反射

通俗的讲,反射就是Java通过类似`"com.imooc.di.entity.Person"`这样的字符串来创建`com.imooc.di.entity`包下面的`Person`对象的功能。这个功能是Java自带的。

**得到Class对象**:`Class<ClassName> clazz = (Class<ClassName>) Class.forName("com.imooc.di.entity.Person");`

**得到Person实例对象**:`Person person = (Person) clazz.getDeclaredConstructor().newInstance();`

**设置Person的name属性为`"张三"`**:

```java

Field field = clazz.getDeclaredField("name");

field.set(person, "张三");

```

上面讲了如何通过`"com.imooc.di.entity.Person"`来创建一个Person类型的对象,以及如何为对象的name属性赋值。有了这部分基础知识我们就可以来理解DI了。

# DI的理解

DI,Dependency Injection,直译就是“依赖注入”。

**依赖**,指的就是我们依赖Spring为我们自动创建类对象。

**注入**,指的就是向已经编译好的代码中注入生成对象,就像打针一样,把药水注(Spring自动创建的类对象)入到血管(已经编译好的代码)中。


回想以下我们为Spring提供了什么?就是`applicationContext.xml`配置文件。

在`applicationContext.xml`中,关于类的信息我们又为Spring提供了什么呢?就是`<bean>`标签。我们是这样写的:

```xml

<bean id="person" class="com.imooc.di.entity.Person">

<property name="name" value="张三">

</bean>

```

你看,Spring可以通过`"applicationContext.xml`获得`com.imooc.di.entity.Person"`、`"name"`和`"张三"`。根据我们前面讲的Java反射的知识,我们知道,Spring可以利用Java反射创建出`Person`对象,并且可以为`name`属性赋值。

到现在为止我们知道了Spring如何产生药水(Person对象)。那么Spring如何知道把药水输入到什么地方呢?是静脉注射还是肌肉注射?`id`信息告诉了Spring这件事。

在Java中我们是这样使用的:

```java

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

Person person = (Person) applicationContext.getBean("person");

```

我们给`getBean()`传入的参数就是`id`。

到这就讲完了DI的原理和运作过程,你是否理解了呢?如果仍然有问题欢迎继续提问。

3

0 学习 · 8263 问题

查看课程

相似问题

回答 1

关于实例化

回答 1

注解的注入

回答 2

关于IOC

回答 1