1. 概念理解
-
依赖:bean 对象的创建依赖于容器
Class class = new Class()
这个过程交给 IOC 容器完成,我们只需要配置.xml
文件即可。
-
注入:bean 对象的所有属性由容器注入
class.value = ×××
这个过程也由 IOC 容器完成,我们也仅配置.xml
文件就可以了。
2. 基于构造函数的依赖注入
-
模板类
package examples; public class ExampleBean { //成员属性 private int years; private String ultimateAnswer; //无参构造函数 public ExampleBean(int years, String ultimateAnswer) {} //有参构造函数 public ExampleBean(int years, String ultimateAnswer) { this.years = years; this.ultimateAnswer = ultimateAnswer; } }
-
IOC 默认使用无参构造函数创建对象,若无无参构造函数,则会报错。
<bean id="exampleBean" class="examples.ExampleBean"/>
-
使用
<constructor-arg />
标签显式调用构造函数创建对象。-
使用
index
属性可以显式指定构造函数参数的索引。<bean id="exampleBean" class="examples.ExampleBean"> <constructor-arg index="0" value="7500000"/> <constructor-arg index="1" value="42"/> </bean>
-
若参数类型唯一,可使用
type
属性显式指定构造函数参数的类型。<bean id="exampleBean" class="examples.ExampleBean"> <constructor-arg type="int" value="7500000"/> <constructor-arg type="java.lang.String" value="42"/> </bean>
-
最常使用的是
name
属性指定构造函数参数名称来消除歧义。<bean id="exampleBean" class="examples.ExampleBean"> <constructor-arg name="years" value="7500000"/> <constructor-arg name="ultimateAnswer" value="42"/> </bean>
-
-
对象是
.xml
文件(配置文件)加载时创建的。如果一个类在.xml
文件中注册了,无论程序是否调用它,它的对象都已经创建并存在了。
3. 基于 Setter 的依赖注入
-
模板类
package com.why.pojo; /** * TODO *实体类 * @author why * @since 2021/4/8 18:09 */ public class Student { private int id; private int age; private String name; //自定义类型 private School school; private String[] books; private List<String> hobbies; private Map<String, String> card; private Set<String> games; private String wife; private Properties info; //所有属性的 set 方法都要实现 public void setName(String name) { this.name = name; } ... }
package com.why.pojo; /** * TODO * 自定义引用类 * @author why * @since 2021/4/8 18:08 */ public class School { private String name; public School() { } public School(String name) { this.name = name; } public void setName(String name) { this.name = name; } }
-
.xml
文件的配置(依赖注入)<bean id="school" class="com.why.pojo.School"> <property name="name" value="加里敦大学"/> </bean> <bean id="student" class="com.why.pojo.Student"> <!--普通值--> <property name="name" value="Why"/> <!--Bean 引用值--> <property name="school" ref="school"/> <!--数组--> <property name="books"> <array> <value>呐喊</value> <value>彷徨</value> <value>朝花夕拾</value> </array> </property> <!--List--> <property name="hobbies"> <list> <value>唱</value> <value>跳</value> <value>rap</value> <value>篮球</value> </list> </property> <!--Map--> <property name="card"> <map> <entry key="学生卡" value="171201211"/> <entry key="身份证" value="123456789"/> </map> </property> <!--Set--> <property name="games"> <set> <value>元气骑士</value> <value>炉石传说</value> </set> </property> <!--NULL--> <property name="wife"> <null/> </property> <!--Properties--> <property name="info"> <props> <prop key="性别">男</prop> <prop key="身高">170CM</prop> </props> </property> </bean>
4. 其他方式的依赖注入
-
p 命名空间
-
可直接注入属性值。
-
本质是
<property/>
标签的运用,也就是基于 setter 依赖注入的扩展。 -
导入 xml 约束。
xmlns:p="http://www.springframework.org/schema/p"
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YMhFc9uY-1625457435160)(Spring.assets/p命名空间xml约束.jpg)]
-
依赖注入
<bean id="student" class="com.why.pojo.Student" p:id="1"> ... </bean>
-
-
c 命名空间
-
可直接注入属性值
-
本质是
<constructor-arg/>
标签的运用,也就是基于构造函数依赖注入的扩展。 -
导入 xml 约束
xmlns:c="http://www.springframework.org/schema/c"
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lnfQiEg7-1625457435163)(Spring.assets/c命名空间xml约束.jpg)]
-
创建要注入依赖的属性的有参构造函数(有且仅有此参数)。
public Student(int age) { this.age = age; }
-
依赖注入
<bean id="student" class="com.why.pojo.Student" c:age="18"> ... </bean>
-