注入(Injection)
什么是注入?
通过Spring工厂以及配置文件,为 所创建的对象成员变量赋值。
为什么要注入?
传统赋值方式 调用set方法一一赋值。通过这种形式为成员变量赋值,存在藕合。
好处:通过注入,降低藕合。
//传统赋值方式 调用set方法赋值
ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");
Person person = (Person) ctx.getBean("person");
person.setId(1);//通过代码赋值 存在藕合
person.setName("adam");
System.out.println("person = "+ person);
//ouput
// person = Person{id=1, name='adam'}
如何进行注入?
- 为类的成员变量提供set get方法
- 配置Spring的配置文件
applicationContext.xml
<bean id="person" class="com.gogogo.Person">
<property name="id">
<value>10</value>
</property>
<property name="name">
<value>Cristina</value>
</property>
</bean>
测试注入结果如下
ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");
Person person = (Person) ctx.getBean("person");
System.out.println("person = "+ person);
//output
// person = Person{id=10, name='Cristina'}
注入的好处是什么?
**解藕合**
只需要修改配置标签里对应的值,不涉及代码修改,不需要重新编译代码。
Spring 注入的原理分析(简易版)
属性值要和代码里定义的属性值对应。
Spring操作配置文件,要将配置文件翻译成对应的代码。
bean
- 反射创建对象
property
- 设置对应的 set
方法
读取bean 标签,获取 id 和 类型 - 反射创建了对象
读取property标签 - 为一个对象的成员变量赋值
读取property内部name属性,对应的value标签,为其赋值 类似set方法
Person person = (Person) ctx.getBean("person");
通过getBean
传入参数person
, 在applicationContext.xml
配置文件里找到对应的bean
标签,创建了类,然后bean
标签里面的property
标签,name="id"
name="name"
这两个对应类成员变量(private String id; private String name;)一一对应,下图两个成员变量是 name password,property
标签里的name
值就分别是name password。value
标签对应的是给成员变量赋值。
Spring 通过底层 调用对象属性对应的set方法
,完成成员变量的赋值,成为set注入。(即必须 提供set方法,可自行验证,注释set方法 编译会报错)。
(反射创建对象 类似,会调用无参构造方法,必须提供类的构造函数,没有的话系统自动提供无参的构造方法,但也是提供了嘿)
学习开心 😄
“Slow progress is better than no progress.”
加加油~