关于DI的理解
来源:1-1 IOC与DI的理解
哆丶哆
2019-08-03 02:59:16
老师,课程中讲到的对DI(依赖注入)的理解,我还是有点模糊,到底DI是怎么利用了反射机制的啊,我之前编程的时候也没在意哪里体现了反射,就知道可以这么写。
1回答
要解释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的原理和运作过程,你是否理解了呢?如果仍然有问题欢迎继续提问。
相似问题