iT邦幫忙

2022 iThome 鐵人賽

DAY 12
0
Software Development

這些年,我們早該學會的Spring Framework系列 第 12

Day12 - Dependency Injection (7) XML設定檔的autowire

  • 分享至 

  • xImage
  •  

Review

Container的職責在於創建、配置與組裝bean,昨天我們學到了
在Spring中如何設定資料庫連線池以及如何將資料庫的資訊寫在外部設定檔中

今日將討論如何使用bean標籤中autowire屬性為bean自動配置
測試案例準備

public class User {
    private String name;
    private String gender = "female";
    private Integer age;
    private UserInfo userInfo;
    private List<UserRole> userRoles;
    public User() {
        System.out.println("user被創建...");
    }
    public User(UserInfo userInfo) {
        System.out.println("調用constructor:public User(UserInfo userInfo)");
        this.userInfo = userInfo;
    }
    //getter setter toString略
}
public class UserRole {
    String roleName;
    //getter setter toString略
}

XML設定檔的autowire

在<bean>標籤中有提供autowire屬性讓container幫你自動裝配自定義類的屬性

  • default/no:不自動裝配
  • byName:按名字,會按照屬性作為id去container找這個bean來配置,找不到就配null
  • byType:按類型,會按照類型去container去查找對應的bean來配置
    • 有多個bean會拋出NoUniqueBeanDefinitionException
    • 找不到會配置null
  • constructor
    1. 先按照有參建構式的參數類型進行配置,沒有就直接裝配null
    2. 若container中該類型有多個,會依參數名稱進行配置

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 http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="userInfo" class="com.swj.UserInfo">
        <property name="title"  value="經理"></property>
    </bean>
    <!-- 將會按照屬性名稱去找container中找id為userInfo的進行配置   -->
    <bean id="user" class="com.swj.User" autowire="byName">
    </bean>
</beans>
@Test
public void testDay12(){
    ApplicationContext ioc = new ClassPathXmlApplicationContext("bean12.xml");
    System.out.println("容器啟動完成....");
    User user = ioc.getBean("user",User.class);
    System.out.println(user);
}

按照屬性名稱找container中對應的id
https://ithelp.ithome.com.tw/upload/images/20220927/20128084HCK6mUR5kg.jpg

Result
https://ithelp.ithome.com.tw/upload/images/20220927/20128084Uu76TmgCN5.jpg

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 http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="userInfo" class="com.swj.UserInfo">
        <property name="title"  value="經理"></property>
    </bean>
    <!-- 將會按照屬性名稱去找container中找id為userInfo的進行配置   -->
    <bean id="user" class="com.swj.User" autowire="byType">
    </bean>
</beans>

Result
https://ithelp.ithome.com.tw/upload/images/20220927/20128084rJVXKJvL8B.jpg

constructor

  1. constructor依類型配置
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    <bean id="userInfo" class="com.swj.UserInfo">
        <property name="title"  value="經理"></property>
    </bean>
    <bean id="user" class="com.swj.User" autowire="constructor">
    </bean>
</beans>

Result
https://ithelp.ithome.com.tw/upload/images/20220927/20128084Vk8bpX4Lzq.jpg

  1. constructor依參數名稱配置
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="userInfo01" class="com.swj.UserInfo">
        <property name="title"  value="總經理"></property>
    </bean>
    <bean id="userInfo" class="com.swj.UserInfo">
        <property name="title"  value="經理"></property>
    </bean>
    <bean id="user" class="com.swj.User" autowire="constructor">
    </bean>
</beans>

Result
https://ithelp.ithome.com.tw/upload/images/20220927/20128084dkTfEpgOy3.jpg


上一篇
Day11 - Dependency Injection (6) 設定資料庫連線池
下一篇
Day13 - Dependency Injection (8) SpEL
系列文
這些年,我們早該學會的Spring Framework30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言