02-Spring基於XML的Bean屬性注入
阿新 • • 發佈:2021-06-12
屬性值注入:就是給屬性賦值
- 建立一個Account類:
public class Account implements Serializable { private int aid; private double balance; public int getAid() { return aid; } public void setAid(int aid) { this.aid = aid; } public double getBalance() { return balance; } public void setBalance(double balance) { this.balance = balance; } @Override public String toString() { return "Account{" + "aid=" + aid + ", balance=" + balance + '}'; } }
- 建立一個User類:
public class User implements Serializable { private String name; private int age; //引用資料型別 private Account account; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Account getAccount() { return account; } public void setAccount(Account account) { this.account = account; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", age=" + age + ", account=" + account + '}'; } }
1. 簡單資料型別和引用資料型別的屬性注入
1.1 寫配置檔案
將User類交給Spring容器管理,在xml配置檔案中新增<bean>
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 將User類交由Spring容器管理--> <bean id="user" class="com.yd.pojo.User"> <!-- 給物件屬性注入值--> <!-- 相當於:user.setName("王二");--> <property name="name" value="王二"></property> <!-- 相當於:user.setAge(20);--> <property name="age" value="20"></property> <!-- 給引用型別屬性注入值--> <property name="account" ref="account"></property> </bean> <bean id="account" class="com.yd.pojo.Account"> <property name="aid" value="101"></property> <property name="balance" value="1888"></property> </bean> </beans>
1.2 執行程式碼
@Test
public void getUser(){
//獲取spring配置檔案生成的物件
ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
//通過bean的id,獲取bean物件
User user = (User)ac.getBean("user");
System.out.println(user);
}
執行結果:
2. 構造器注入
- 給類加上無參構造和有參構造
2.1 配置檔案注入
使用
- 構造引數有幾個就要寫幾個,要與構造方法匹配
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="user" class="com.yd.pojo.User">
<constructor-arg name="name" value="小麗"></constructor-arg>
<constructor-arg name="age" value="18"></constructor-arg>
<constructor-arg name="account" ref="account"></constructor-arg>
</bean>
<bean id="account" class="com.yd.pojo.Account">
<constructor-arg name="aid" value="201"></constructor-arg>
<constructor-arg name="balance" value="9999.05"></constructor-arg>
</bean>
</beans>
2.2 執行上面1.2的程式碼
執行結果:
3. 自動注入
3.1 根據型別 autowire="byType"(區域性)
- 將User類的構造方法新增一個兩個引數的構造,與xml匹配
- 在對應的bean標籤上新增屬性autowire="byType"
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!--autowire="byType" 根據型別自動注入-->
<bean id="user" class="com.yd.pojo.User" autowire="byType">
<constructor-arg name="name" value="小麗"></constructor-arg>
<constructor-arg name="age" value="18"></constructor-arg>
</bean>
<bean id="account" class="com.yd.pojo.Account">
<constructor-arg name="aid" value="201"></constructor-arg>
<constructor-arg name="balance" value="8888.08"></constructor-arg>
</bean>
</beans>
執行1.2程式碼結果:
3.2 根據屬性名 autowire="byName"(區域性)
- 使用值注入,就不用帶參構造(也可以同3.1使用構造注入)
- 在對應的bean標籤上新增屬性autowire="byName"
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!--autowire="byName" 根據屬性名自動注入-->
<bean id="user" class="com.yd.pojo.User" autowire="byName">
<property name="name" value="小王"></property>
<property name="age" value="23"></property>
</bean>
<bean id="account" class="com.yd.pojo.Account">
<constructor-arg name="aid" value="201"></constructor-arg>
<constructor-arg name="balance" value="8888.08"></constructor-arg>
</bean>
</beans>
執行1.2程式碼結果:
3.3 全域性設定自動注入
- 在最大的<beans>標籤中新增全域性自動注入default-autowire="byType"
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd"
default-autowire="byType">
<bean id="user" class="com.yd.pojo.User">
<property name="name" value="小李"></property>
<property name="age" value="30"></property>
</bean>
<bean id="account" class="com.yd.pojo.Account">
<constructor-arg name="aid" value="301"></constructor-arg>
<constructor-arg name="balance" value="6666.08"></constructor-arg>
</bean>
</beans>
執行1.2程式碼結果:
4. 總結
- 區域性注入只針對單個的bean物件;
- 全域性注入針對的是<beans>下所有的bean物件;
- 開發中推薦使用autowire="byType",全域性/區域性根據實際情況選擇。
4. 空值注入
- <value/>
- value = ""
- <null/>表示的是null,空指標
- value = "null" 表示的是“null”字串
**** 注意:注意區分空指標和null字串!
5. 集合屬性注入(array、set、list、map、properties)(瞭解)
- 建一個Data類放以上屬性(需包含get/set/toString方法)
- xml配置bean
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd"
default-autowire="byName">
<bean id="data" class="com.yd.pojo.Data">
<property name="array">
<array>
<value>蘇州</value>
<value>無錫</value>
<value>常州</value>
</array>
</property>
<property name="list">
<list>
<value>蒸羊羔</value>
<value>蒸熊掌</value>
<value>蒸鹿尾</value>
</list>
</property>
<property name="set">
<set>
<value>北京</value>
<value>北京</value>
<value>天津</value>
<value>河北</value>
</set>
</property>
<property name="map">
<map>
<entry key="101" value="張三"/>
<entry key="102" value="李四"/>
<entry key="103" value="王五"/>
</map>
</property>
<property name="properties">
<props>
<prop key="user">root</prop>
<prop key="pwd">123456</prop>
<prop key="sex">male</prop>
</props>
</property>
</bean>
</beans>
- 執行程式碼
@Test
public void getData(){
//獲取spring配置檔案生成的物件
ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
Data data = (Data) ac.getBean("data");
System.out.println(data);
}
- 執行結果:
-
注意:1. set集合存放不重複的資料
2. default-autowire="byName",若是byType,properties會自動注入系統預設屬性值(系統配置資訊等)