回顧
上一篇我們介紹Spring中2種依賴注入的方式:
- 建構式注入,主要的標簽是
<constructor-arg/> - Setter方法注入,主要的標簽是
<property/>
那么問題來了,普通型別的依賴怎么注入,集合依賴怎么注入,null怎么注入?本篇全面了解下,
本文內容
- 普通型別和字串注入
- 參考型別的注入
- 集合的注入
- 內部bean注入
null和空字串注入- 復合屬性注入
普通型別和字串注入
基本型別和字串,通過value元素直接指定值,上案例,對照類和配置,
package com.crab.spring.ioc.demo03;
/**
* @author zfd
* @version v1.0
* @date 2022/1/13 15:07
* @關于我 請關注公眾號 螃蟹的Java筆記 獲取更多技術系列
*/
public class SimpleBean {
private String name;
private int age;
private float height;
// 省略 Getter Setter toString()
}
<bean id="simpleBean">
<property name="name" value="https://www.cnblogs.com/kongbubihai/p/xxx"/>
<property name="age" value="https://www.cnblogs.com/kongbubihai/p/12"/>
<property name="height" value="https://www.cnblogs.com/kongbubihai/p/123.45f"/>
</bean>
參考型別的注入
參考型別型別通過ref標簽設定,
public class MyBean {
private RefBean refBean;
public void setRefBean(RefBean refBean) {
this.refBean = refBean;
}
}
public class RefBean {
}
<!-- 參考型別-->
<bean id="refBean"/>
<bean id="myBean">
<property name="refBean" >
<ref bean="refBean"/>
</property>
</bean>
注意: ref 元素的本地屬性在 4.0 bean XSD 中不再受支持,因為它不再提供常規 bean 參考的值,升級到 4.0 模式時,將現有的 ref 本地參考更改為 ref bean,如下例子
// 4.0前 <property name="refBean" ref="refBean" > // 4.0改成 <property name="refBean" > <ref bean="refBean"/> </property>
內部bean注入
<property/> 或 <constructor-arg/> 元素中的 <bean/> 元素定義了一個內部 bean,內部 bean 始終是匿名的,并且始終使用外部 bean 創建,無法獨立訪問內部 bean 或將它們注入到別的 bean中
<!-- 內部bean的方式-->
<bean id="myBean">
<property name="refBean">
<bean />
</property>
</bean>
集合的注入
<list/>、<set/>、<map/> 和<props/> 元素分別設定Java 集合型別List、Set、Map 和Properties 的屬性和引數,<map/>鍵或值,<set/>的值也可以是以下任何元素:
bean | ref | idref | list | set | map | props | value | null
集合注入綜合案例
一個綜合樣例滿足你,
package com.crab.spring.ioc.demo03;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
/**
* @author zfd
* @version v1.0
* @date 2022/1/13 15:53
* @關于我 請關注公眾號 螃蟹的Java筆記 獲取更多技術系列
*/
public class ComplexObject {
//屬性
private Properties adminEmails;
//串列
private List<Object> someList;
// map
private Map<String, Object> someMap;
// set
private Set<Object> someSet;
// 省略 Getter Setter
}
<!-- 集合-->
<bean id="complexObject">
<property name="adminEmails">
<props>
<prop key="administrator">[email protected]</prop>
<prop key="support">[email protected]</prop>
<prop key="development">[email protected]</prop>
</props>
</property>
<!-- results in a setSomeList(java.util.List) call -->
<property name="someList">
<list>
<value>a list element followed by a reference</value>
<ref bean="myBean" />
</list>
</property>
<!-- results in a setSomeMap(java.util.Map) call -->
<property name="someMap">
<map>
<entry key="an entry" value="https://www.cnblogs.com/kongbubihai/p/just some string"/>
<entry key="a ref" value-ref="myBean"/>
</map>
</property>
<!-- results in a setSomeSet(java.util.Set) call -->
<property name="someSet">
<set>
<value>just some string</value>
<ref bean="myBean" />
</set>
</property>
</bean>
集合元素的合并
Spring 容器支持合并集合,可以定義在父bean中定義 <list/>、<map/>、<set/> 或 <props/> 元素,子bean中 <list/>、<map/>、<set/> 或 <props/> 元素從父集合繼承,也就是說,子bean的集合的值是合并父集合和子集合的元素的結果,子集合元素覆寫父集合中指定的值,注意: 結合型別要一致,如都是List,
<!-- 集合合并-->
<bean id="parent" abstract="true" >
<property name="adminEmails">
<props>
<prop key="administrator">[email protected]</prop>
<prop key="support">[email protected]</prop>
</props>
</property>
</bean>
<bean id="child" parent="parent">
<property name="adminEmails">
<!-- the merge is specified on the child collection definition -->
<props merge="true">
<prop key="sales">[email protected]</prop>
<prop key="support">[email protected]</prop>
</props>
</property>
</bean>
集合元素指定型別
綜合案例中的集合元素型別都是Object,Spring中也支持指定更具體的型別如Integer,來個例子,
public class AccountBean {
private Map<String, Float> accounts;
public void setAccounts(Map<String, Float> accounts) {
this.accounts = accounts;
}
}
<!-- 集合元素指定型別-->
<bean id="accountBean" >
<property name="accounts">
<map>
<entry key="one" value="https://www.cnblogs.com/kongbubihai/p/9.99"/>
<entry key="two" value="https://www.cnblogs.com/kongbubihai/p/2.75"/>
<entry key="six" value="https://www.cnblogs.com/kongbubihai/p/3.99"/>
</map>
</property>
</bean>
null和空字串注入
null和空字串注入很簡單,直接看案例,
public class EmptyStringBean {
private String name;
private Integer code;
// 省略 Getter Setter
}
<!-- `null`和空字串注入-->
<bean >
<property name="name" value=""/>
<property name="code">
<null></null>
</property>
</bean>
復合屬性注入
在設定 bean 屬性時使用復合或嵌套屬性名稱,只要路徑的所有物件(最終屬性名稱除外)不為空即可,中間物件為null將引發 NullPointerException,直接看案例
public class NestedBean {
private SimpleBean simpleBean;
public SimpleBean getSimpleBean() {
return simpleBean;
}
public void setSimpleBean(SimpleBean simpleBean) {
this.simpleBean = simpleBean;
}
}
<!-- 復合屬性-->
<bean id="nestedBean">
<property name="simpleBean.name" value="https://www.cnblogs.com/kongbubihai/p/xxx"/>
</bean>
總結
本文介紹各種依賴屬性如何注入到bean中,內容非常詳細,建議動手寫一下案例實踐并消化,畢竟好記性不如爛筆頭,站在岸上學不會游泳,
本篇原始碼地址: https://github.com/kongxubihai/pdf-spring-series/tree/main/spring-series-ioc/src/main/java/com/crab/spring/ioc/demo03
知識分享,轉載請注明出處,學無先后,達者為先!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/421306.html
標籤:Java
上一篇:用于將容器推送到GithubContainerRegistry的GithubActions作業流程因“未經身份驗證”而失敗
