1. 程式人生 > 其它 >Spring深入淺出(七),自動裝配,byName/byType

Spring深入淺出(七),自動裝配,byName/byType

Bean 的裝配可以理解為依賴關係注入,Bean 的裝配方式也就是 Bean 的依賴注入方式。Spring 容器支援多種裝配 Bean 的方式,如基於 XML 的 Bean 裝配、基於 Annotation 的 Bean 裝配和自動裝配等。

自動裝配就是指 Spring 容器在不使用 <constructor-arg> 和<property> 標籤的情況下,可以自動裝配(autowire)相互協作的 Bean 之間的關聯關係,將一個 Bean 注入其他 Bean 的 Property 中。

使用自動裝配需要配置 <bean> 元素的 autowire 屬性。常用的:no/byName/byType。什麼是byType,什麼是byName?

<bean id="userServiceImpl"
            class="cn.com.bochy.service.impl.UserServiceImpl"
            autowire="byName">
       </bean>  
      <bean id="userDao"                                         
             class="cn.com.bochy.dao.impl.UserDaoImpl">
</bean>

byName:根據屬性名(Bean的id或者name)自動裝配。此選項將檢查容器並根據名字查詢與屬性完全一致的bean,並將其與屬性自動裝配。

byType:如果容器中存在一個與指定class型別相同的bean,那麼將與該屬性自動裝配;如果存在多個該型別bean,那麼丟擲異常,並指出不能使用byType方式進行自動裝配;如果沒有找到相匹配的bean,則什麼事都不發生。

一、自動裝配 byName

1. 建立主業務類

package com.clzhang.spring.demo;

public class TextEditor {
       private SpellChecker spellChecker;
       private String name;
       public void setSpellChecker( SpellChecker spellChecker ){
          
this.spellChecker = spellChecker; } public SpellChecker getSpellChecker() { return spellChecker; } public void setName(String name) { this.name = name; } public String getName() { return name; } public void spellCheck() { spellChecker.checkSpelling(); } }

2. 建立業務邏輯實現類

package com.clzhang.spring.demo;

public class SpellChecker {
    public SpellChecker() {
        System.out.println("Inside SpellChecker constructor.");
    }

    public void checkSpelling() {
        System.out.println("Inside checkSpelling.");
    }
}

3. 建立主程式

package com.clzhang.spring.demo;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
        TextEditor te = (TextEditor) context.getBean("textEditor");
        te.spellCheck();
    }
}

4. 配置檔案之前的寫法

<?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-3.0.xsd">
    
   <!-- Definition for textEditor bean -->
   <bean id="textEditor" class="com.clzhang.spring.demo.TextEditor" autowire="byName">
       <property name="spellChecker" ref="spellChecker" />
       <property name="name" value="Generic Text Editor" />
   </bean>

   <!-- Definition for spellChecker bean -->
   <bean id="spellChecker" class="com.clzhang.spring.demo.SpellChecker">
   </bean>
</beans>

5. 配置檔案自動裝配的寫法

<?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-3.0.xsd">
    
   <!-- Definition for textEditor bean -->
   <bean id="textEditor" class="com.clzhang.spring.demo.TextEditor" autowire="byName">
       <property name="name" value="Generic Text Editor" />
   </bean>

   <!-- Definition for spellChecker bean -->
   <bean id="spellChecker" class="com.clzhang.spring.demo.SpellChecker">
   </bean>
</beans>

6. 執行

Inside SpellChecker constructor.
Inside checkSpelling.

二、自動裝配 byType

針對上面的程式碼,只需要更改配置檔案,由:byName更改為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-3.0.xsd">
    
   <!-- Definition for textEditor bean -->
   <bean id="textEditor" class="com.clzhang.spring.demo.TextEditor" autowire="byType">
       <property name="name" value="Generic Text Editor" />
   </bean>

   <!-- Definition for spellChecker bean -->
   <bean id="spellChecker" class="com.clzhang.spring.demo.SpellChecker">
   </bean>
</beans>

本文參考:

https://www.w3cschool.cn/wkspring/8dhy1mmd.html