Spring 的属性注入
Spring 的属性注入,我们可以理解成之前说过的 DI (依赖注入)。
注入方式
对于类成员变量,注入方式有三种:
- 构造函数注入
- 属性 setter 注入
- 接口注入
spring 支持前两种注入方式
1. 构造方法注入
- 通过构造方法注入 Bean 的属性值或依赖的对象,它保证了 Bean 实例在实例化后就可以使用
- 构造器注入在 ```
元素里声明的属性
举个例子:
<!-- Bean 的构造方法的属性注入 -->
<bean id="user" class="com.test.ioc.demo4.User">
<constructor-arg name="name" value="张三" />
<constructor-arg name="age" value="23" />
</bean>
2. set 方法注入
- 使用 set 方法注入,在 Spring 配置文件中,通过
设置注入的属性
举个例子:
<!-- Bean 的 set 方法的属性注入 -->
<bean id="person" class="com.test.ioc.demo4.Person">
<property name="name" value="张三" />
<property name="age" value="23" />
<property name="cat" ref="cat" />
</bean>
<bean id="cat" class="com.test.ioc.demo4.Cat">
<property name="name" value="ketty" />
</bean>
其中:
ref 用来引入其他 bean 的 id 或 name
普通类型的值使用 value
对象类型的值使用 ref
3. p 名称空间注入
- 使用 p 命名空间
- 为了简化 XML 文件配置,Spring 从 2.5 开始引入一个新的 p 名称空间
p:<属性名>="xxx"
引入常量值p:<属性名>-ref="xxx"
引入其他 Bean 对象
举个例子:
<!-- Bean 的 p 名称空间的属性注入 -->
<bean id="person" class="com.test.ioc.demo4.Person" p:name="张三" p:age="23" p:cat-ref="cat" />
<bean id="cat" class="com.test.ioc.demo4.Cat" p:name="阿黄"/>
注意: 如果使用 p 名称空间注入,我们需要在 xml 文件开头的加入一句:
xmlns:p="http://www.springframework.org/schema/p"
表示引入 p 名称空间注入方式。
4. SpEL 注入
- SpEL:spring expression language,spring 表达式语言,对依赖注入进行简化
- 语法:#{表达式}
<bean id="" value="#{表达式}">
SpEL 表达式语言:
语法:#{}
#{'hello'}:使用字符串
#{topicId3}:使用另一个 bean
#{topicId4.content.toUpperCase()}:使用指定名属性,并使用方法
#{T(java.lang.Math).PI}:使用静态字符或方法
举个例子:
<!-- Bean 的 SpEL 的属性注入 -->
<bean id="category" class="com.test.ioc.demo4.Category">
<property name="name" value="#{'服装'}" />
</bean>
<bean id="productInfo" class="com.test.ioc.demo4.ProductInfo" />
<bean id="product" class="com.test.ioc.demo4.Product">
<property name="name" value="#{'男装'}" />
<property name="price" value="#{productInfo.calculatePrice()}" />
<property name="category" value="#{category}" />
</bean>
5. 复杂类型的属性注入
- 数组类型的属性注入
- List 集合类型的属性注入
- Set 集合类型的属性注入
- Map 集合类型的属性注入
- Properties 类型的属性注入
举个例子:
<!-- 集合类型的属性注入 -->
<bean id="collectionBean" class="com.test.ioc.demo5.CollectionBean">
<!-- 数组类型 -->
<property name="arrs">
<list>
<value>aaa</value>
<value>bbb</value>
<value>ccc</value>
</list>
</property>
<!-- List 类型 -->
<property name="list">
<list>
<value>111</value>
<value>222</value>
<value>333</value>
</list>
</property>
<!-- Set 类型 -->
<property name="set">
<set>
<value>ddd</value>
<value>eee</value>
<value>fff</value>
</set>
</property>
<!-- Map 类型 -->
<property name="map">
<map>
<entry key="aaa" value="111" />
<entry key="bbb" value="222" />
<entry key="ccc" value="333" />
</map>
</property>
<!-- Properties 类型 -->
<property name="properties">
<props>
<prop key="username">root</prop>
<prop key="password">1234</prop>
</props>
</property>
</bean>
复杂类型的属性注入,主要是在 Spring 整合其他框架的时候,会比较常用到。