堅持住,第四天,繼續學習spring4.詳解如何注入參數
先總結,主要有如下6種:
1,基本類型值;
2,注入 bean;
3,內部 bean;
4,null 值;
5,級聯屬性;
6,集合類型屬性;
詳解如下:↓↓↓↓↓
1,基本類型值;(前面第3課的依賴注入的屬性注入就是基本類型注入參數,這里不贅述)
? ? <bean id="people2" class="com.java1234.entity.People">
? ? ? ? ? <property name="id" value="1"></property>
? ? ? ? ? <property name="name" value="張三"></property>
? ? ? ? ? ?<property name="age" value="11"></property>
? ? </bean>
2,注入 bean;(第2課也學過,就是bean里面在ref引用另外一個bean,這里不贅述)
bean.xml內容
<bean id="dog1" class="com.java1234.entity.Dog"><property name="name" value="Jack"></property> </bean> <bean id="people2" class="com.java1234.entity.People"><property name="id" value="1"></property><property name="name" value="張三"></property><property name="age" value="11"></property><!--這里的dog是People類內定義的1個對象類名,而dog1是文件上面定義過的一個bean --><property name="dog" ref="dog1"></property> </bean>
People類的內容:
public class People {private int id;private String name;private int age;private Dog dog; // 和bean.xml的name的dog一致
。。。。。。。。
}
3,內部 bean;(只能被內部引用,類似java的內部類)
<bean id="people3" class="com.java1234.entity.People"><property name="id" value="1"></property><property name="name" value="張三"></property><property name="age" value="11"></property><property name="dog"> <!--和第2種的差異就是,這里不用ref屬性了,使用bean標簽定義內部類--><bean class="com.java1234.entity.Dog"> <!--用bean標簽 定義內部類--><property name="name" value="Tom"></property></bean></property> </bean>
4,null 值;(這玩意,用于強制清空默認值,避免隱式邏輯導致的意外行為)
? 使用頻率較低 , 隨便看看跳過吧
當需要為 Bean 屬性或構造函數參數賦予 null 值時,使用 null 標簽明確指示,避免 Spring 容器嘗試注入默認值或拋出異常。
<bean id="people4" class="com.java1234.entity.People"><property name="id" value="1"></property><property name="name" value="張三"></property><property name="age" value="11"></property><property name="dog"><null></null> <!-- null標簽 表示沒有dog--></property>
</bean>
目前流行的強制清空默認值的替代處理方式是注解驅動,比如
4.1):使用 @Value 注入 null
@Component
public class DataService { @Value("#{null}") // SpEL 顯式賦 null private String customStrategy;
}
4.2 條件化 Bean 注入
@Configuration
public class AppConfig { @Bean @ConditionalOnProperty(name = "feature.cache.enabled", havingValue = "false") public CacheManager cacheManager() { return null; // 直接返回 null Bean }
}
5,級聯屬性; (不常用,跳過)
6,集合類型屬性;?
三種集合類型List,Set,Map 以及Props(有點類似map,主要用于配置系統參數等),
幾種標簽寫法有差異,熟悉下,用時備查就行
?? ?<bean id="people6" class="com.java1234.entity.People">
?? ??? ?<property name="id" value="1"></property>
?? ??? ?<property name="name" value="張三"></property>
?? ??? ?<property name="age" value="11"></property>
?? ??? ?<property name="dog" ref="dog1"></property>
?? ??? ?<property name="hobbies"> ?<!-- 設置集合 -->
?? ??? ??? ?<list>
?? ??? ??? ??? ?<value>唱歌</value>
?? ??? ??? ??? ?<value>跳舞</value>
?? ??? ??? ?</list>
?? ??? ?</property>
?? ??? ?<property name="loves">
?? ??? ??? ?<set>
?? ??? ??? ??? ?<value>唱歌2</value>
?? ??? ??? ??? ?<value>跳舞2</value>
?? ??? ??? ?</set>
?? ??? ?</property>
?? ??? ?<property name="works">
?? ??? ??? ?<map>
?? ??? ??? ??? ?<entry>??<!--有key 和 value的鍵值對-->
?? ??? ??? ??? ??? ?<key><value>上午</value></key>
?? ??? ??? ??? ??? ?<value>寫代碼</value>
?? ??? ??? ??? ?</entry>
?? ??? ??? ??? ?<entry>
?? ??? ??? ??? ??? ?<key><value>下午</value></key>
?? ??? ??? ??? ??? ?<value>測試代碼</value>
?? ??? ??? ??? ?</entry>
?? ??? ??? ?</map>
?? ??? ?</property>
?? ??? ?<property name="addresses">
?? ??? ??? ?<props>? <!--有key 和 value的鍵值對-->
?? ??? ??? ??? ?<prop key="address1">aaaaa</prop>
?? ??? ??? ??? ?<prop key="address2">bbbbb</prop>
?? ??? ??? ?</props>
?? ??? ?</property>
?? ?</bean>