文章目录
依赖注入
- 什么是注入
- 通过Spring工厂以及配置文件,为所创建的对象的成员变量赋值
- 为什么需要注入
- 通过编码的方式,为成员变量进行赋值,存在耦合
set注入
01 概述
- 实质上调用的是set方法
- 必须有set方法,没有是错误的
- 首先执行无参构造,然后执行set方法
- 只要set方法在就行了,也就说这个属性不一定要存在
- 针对不同类型的成员变量,在
<property>
标签之中,嵌套其他类型的标签
02 JDK内置类型
2.1 基本数据类型 和 String
- 对于基本数据类型和String,都使用
value标签
进行标签进行赋值 - 这里的 name就是对象的属性名
<bean id="user" class="com.spring.model.User">
<property name="username">
<value>编程小菜鸡</value>
</property>
</bean>
2.2 数组类型
- 对于数组类型,使用
list标签
进行注入,然后在list标签中,对数组元素进行注入,因为这里是基本类型,这里使用value标签
<bean id="user" class="com.spring.model.User">
<property name="arr">
<list>
<value>1</value>
<value>2</value>
<value>3</value>
</list>
</property>
</bean>
2.3 set集合
- 对set集合进行注入,使用set标签,针对Set集合的泛型,使用不同的标签进行注入
<bean id="user" class="com.spring.model.User">
<property name="set">
<set>
<value>111</value>
</set>
</property>
</bean>
2.4 list集合
- 对于
List集合
,使用**list标签**
进行注入 - 针对 List集合的泛型,选择不同的标签对集合中的元素进行注入
<bean id="user" class="com.spring.model.User">
<property name="list">
<list>
<value>111</value>
</list>
</property>
</bean>
2.5 Map集合
- 对于Map集合,使用
map标签
进行注入。 - 对于每一个键值对,使用
entry标签
,进行注入 - 在entry标签之中,使用
key标签
对键进行注入
<bean id="user" class="com.spring.model.User">
<property name="map">
<map>
<entry>
<key>
<value>1</value>
</key>
<value>1</value>
</entry>
</map>
</property>
</bean>
2.6 Properties集合
Properties 类型,是特殊的Map集合,有因为键和值都是String类型
<bean id="user" class="com.spring.model.User">
<property name="properties">
<props>
<prop key="key1">佩奇</prop>
<prop key="key2">乔治</prop>
</props>
</property>
</bean>
03 用户自定义类型
3.1 方式一
<bean id="student" class="com.hl.spring.Student">
<property name="school" ref="school"/>
</bean>
<bean id="school" class="com.hl.spring.School">
<property name="name" value="佩奇"></property>
</bean>
3.2 方式二
<bean id="user" class="com.spring.model.User">
<property name="address">
<bean class="com.spring.model.Address">
<property name="address">
<value>甘肃省兰州市</value>
</property>
</bean>
</property>
</bean>
3.3 引用类型自动注入
Spring根据某些规则可以给引用类型赋值
使用的规则最常用的就是byName
byType
byName
定义
- java类中引用类型的属性名和spring容器中(配置文件)bean的id名称一样,且数据类型是一致的,这样的容器中的bean,spring能够赋值给引用类型
方式
- 在bean中加入
autowire = "byName"
代码说明
<bean id="student" class="com.hl.spring.Student" autowire="byName">
<property name="id" value="1"></property>
<property name="name" value="张三"></property>
<property name="sex" value="男"></property>
<property name="password" value="123456"></property>
</bean>
<bean id="school" class="com.hl.spring.School">
<property name="name" value="XXX大学"></property>
</bean>
byType
定义
- 按照类型注入,java类中引用类型的数据类型和spring容器中(配置文件)的class属性是同源关系的,这样的bean能够赋值给引用类型
方式
- 在bean中加入
autowire = "byType"
同源
- java类中引用类型的数据类型和bean的class的值是一样的
- java类中引用类型的数据类型和bean的class的值是父子关系
- java类中应用类型的数据类型和bean的class的值接口和实现类关系
注意事项
- 在xml配置文件中声明bean只能有一个符合条件的
- 多余一个是错误的
代码说明
<bean id="student" class="com.hl.spring.Student" autowire="byType">
<property name="id" value="1"></property>
<property name="name" value="张三"></property>
<property name="sex" value="男"></property>
<property name="password" value="123456"></property>
</bean>
<bean id="school" class="com.hl.spring.School">
<property name="name" value="兰州理工大学"></property>
</bean>
04 简化书写
<bean id="user" class="com.spring.model.User" p:name="佩奇" p:address-ref="address"></bean>
<bean id="address" class="com.spring.model.Address" p:address="甘肃兰州"></bean>
05 使用多配置文件
当项目规模比较大的时候,使用多个配置文件
5.1 优势
- 每个文件的大小比一个文件小很多
- 效率高
- 避免多人竞争带来的冲突
- 如果说你的项目有多个模块,一个模块设置一个配置文件
5.2 多文件的分配方式
- 按功能模块:一个模块一个配置文件
- 按照类的功能:数据库相关的配置一个文件配置文件,做事务的功能一个配置文件,做service功能的一个配置文件等
语法
- resource是指其他配置文件的路径
- classpath表示类路径(class文件所在的目录),告诉Spring去哪里加载
- 在包含关系的配置文件中,可以使用通配符(*)表示任意字符—注意:这些文件都必须放在同一个目录中
<import resource="classpath:配置文件名称"></import>
构造注入
spring调用有参数的构造函数
public Student(int id, String name, String sex, School school, String password) {
this.id = id;
this.school = school;
}
01 通过index属性
- 构造方法中的形参,从左向右依次进行排序,从0开始
- 这里的index是可以省略的
<bean id="student" class="com.hl.spring.Student">
<constructor-arg index="0" value="1"></constructor-arg>
<constructor-arg index="1" ref="school"></constructor-arg>
</bean>
<bean id="school" class="com.hl.spring.School">
<property name="name" value="兰州理工大学"></property>
</bean>
02 通过name属性
- name值构造方法中的形参值
- value是赋值
<bean id="student" class="com.hl.spring.Student">
<constructor-arg name="id" value="1"></constructor-arg>
<constructor-arg name="school" ref="school"></constructor-arg>
</bean>
<bean id="school" class="com.hl.spring.School">
<property name="name" value="兰州理工大学"></property>
</bean>