依赖注入
依赖注入属于IoC。
五种关系:继承、依赖、关联、聚合、组合
当创建User对象时,(dept对象不能为空),如何自动的创建Dept并将其赋给dept。
*依赖注入需要IoC的环境,依赖的双方必须全部交给Spring管理。
1 基于xml的依赖注入
1.1简单类型的属性的依赖注入
1.1.1 构造方法注入
① 需要重载构造方法,一般开发中需要保留默认构造
<bean id="user" class="com.pojo.User">
<!--
为构造方法指定参数的值
index:指定构造方法中参数的索引
value:用于简单参数的赋值
name:和index在同一个constructor-arg中出现一个就可以了,表示形参的参数名称
ref:如果参数为引用类型的参数,赋值时使用ref
type:用于指定参数的类型,当形参数量以及名称相同时,指定该参数的数据类型
-->
<constructor-arg index="0" value="100"></constructor-arg>
<constructor-arg name="pwd" value="pwd"></constructor-arg>
<constructor-arg index="1" value="add"></constructor-arg>
</bean>
1.1.2 setter方法注入【推荐使用】
与get方法无关。
① 必须有公有的set方法
② 需要用property标签 对set方法进行注入
<bean id="user" class="com.pojo.User">
<!--
name:指定属性的名称(需要有set方法)
value:指定属性的值
ref:如果参数为引用类型的参数,赋值时使用ref
-->
<property name="id"></property>
</bean>
1.1.3 P命名空间注入
① 需要引入一个命名空间
xmlns:p="http://www.springframework.org/schema/p"
② 在bean属性中使用p
属性
<bean id="user" class="com.pojo.User" p:id="123" p:name="name"></bean>
1.1.4 SPEL表达式注入
spel指的就是spring 表达语言的简写。
#{常量}
#{变量}
#{表达式}
<bean id="user" class="com.pojo.User" p:id="#{user2.id}"></bean>
<bean id="user" class="com.pojo.User" p:id=""></bean>
1.2 引用数据类型的依赖注入
value是用于简单类型的属性的依赖注入,ref引用地址(我们在标签中定义的id或name)
① 在getBean() 的时候才会进行依赖注入。在创建对象时不会依赖注入。
② 在进行懒加载时,就会先进行依赖注入
1.3 其他类型的依赖注入
用于整合第三方架构时,需要向第三方架构提供的对象中注入值。均使用set方法注入。
1.3.1 Map类型的注入
<bean id="user" class="com.pojo.User">
<property name="map">
<map>
<entry key="key1" value="10"></entry>
<entry key="key2" value-ref="引用数据类型"></entry>
<entry key-ref="引用数据类型" value="100"></entry>
</map>
</property>
</bean>
1.3.2 List类型的注入
<bean id="user" class="com.pojo.User">
<property name="list">
<list>
<value>1</value>
<bean class="com.pojo.dept"></bean>
</list>
</property>
</bean>
1.3.3 Set类型的注入
除了标签不同与list集合基本相同。
1.3.4 properties类型的注入
2 基于注解的依赖注入
依赖的双方可以分别使用xml或注解。
@Autowired
按类型注入,回去容器找对应类型
//当容器没有找到该类型时,required属性为true时则报错,为false时则值为默认
//如果
@Autowired(required = true)
private dept dept;
@Resource
按名称注入,会去容器中找name或id叫dept的bean。如果该属性名称注入失败,则按照类型进行注入。
//按名称注入,会去容器中找name或id叫dept的bean
@Resource(name = "dept")
private dept dept;
组合注解
基本少用。
简单类型的属性注入
@value(123)
写在简单类型上。