SpringFramework|基於XML的兩種自動裝配

SpringFramework|基於XML的兩種自動裝配

環境交代

Java: 1.8java

Maven: 3spring

SpringFramework版本以及各組件成員: 5.1.1.RELEASEthis

  • spring-context
  • spring-core
  • spring-beans

自動裝配byName

來自: W3CSchool中的概述code

這種模式由屬性名稱指定自動裝配。Spring 容器看做 beans,在 XML 配置文件中 beans 的 auto-wire 屬性設置爲 byName。而後,它嘗試將它的屬性與配置文件中定義爲相同名稱的 beans 進行匹配和鏈接。若是找到匹配項,它將注入這些 beans,不然,它將拋出異常。xml

對比示例 (byName在設值注入的應用)

其目的是省略XML中的一些配置, 以減小代碼量.對象

原例

Bean - Bean.javaget

❗這個Bean只是因爲Spring配置所寫順口叫的, 並不符合嚴格意義上的JavaBean.it

package noioo;

public class Bean {

    public void sayHelloWorld(){
        System.out.println("Hello World");
    }
}

Bean的使用者, 它依賴這個Bean - BeanUser.javaio

package noioo;

public class BeanUser {

    private Bean beanName;


    public Bean getBeanName() {
        return beanName;
    }

    public void setBeanName(Bean beanName) {
        this.beanName = beanName;
    }

    public void useSayHelloWorld(){
        beanName.sayHelloWorld();
    }
}

Spring XML配置文件 - spring-beans.xmlclass

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:lang="http://www.springframework.org/schema/lang"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd">

    <bean id="beanUser" class="noioo.BeanUser">
        <!-- 待會咱們將省略下面這個property配置 -->
        <property name="beanName" ref="bean"/> 
    </bean>

    <bean id="beanName" class="noioo.Bean">
    </bean>
</beans>

執行者 - Runner.java

package noioo;

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

public class Runner {

    public static void main(String[] args){
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-beans.xml");
        BeanUser beanUser = (BeanUser)context.getBean("beanUser");
        beanUser.useSayHelloWorld();
    }
}
運行結果
Hello World

Process finished with exit code 0

使用byName來省略其中的一些配置

修改spring-beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:lang="http://www.springframework.org/schema/lang"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd">

    <!-- 去掉了property, 新增了屬性autowire="byName" -->
    <bean id="beanUser" class="noioo.BeanUser" autowire="byName">
    
    </bean>

    <!-- 這裏的id值對應了BeanUser中的屬性名bean -->
    <bean id="beanName" class="noioo.Bean">

    </bean>

</beans>

也就是說, 在BeanUser這個類中的屬性private Bean beanName將被取出, 用來匹配同名爲"beanName"的Spring Bean.

運行結果

運行結果同樣.

Hello World

Process finished with exit code 0

雖然在這裏省略的代碼並非不少, 畢竟只有一個對象....


自動裝配byType

這種模式由屬性類型指定自動裝配。Spring 容器看做 beans,在 XML 配置文件中 beans 的 autowire 屬性設置爲 byType。而後,若是它的 type 剛好與配置文件中 beans 名稱中的一個相匹配,它將嘗試匹配和鏈接它的屬性。若是找到匹配項,它將注入這些 beans,不然,它將拋出異常。

來自: W3CSchool中的概述

示例

上面的Java代碼不用改, 僅僅修改配置文件便可.

Spring配置文件 - spring-beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:lang="http://www.springframework.org/schema/lang"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd">

    <bean id="beanUser" class="noioo.BeanUser" autowire="byType">
        <!-- 它將會以定義的屬性值的類型來匹配這裏的Bean名,
                    屬性值是Bean, 也就是將會匹配一個類型爲"Bean"的Spring Bean
                -->
    </bean>

    <!-- 由於是根據類型匹配的, 咱們甚至連給這個Bean起id都不用 -->
    <bean class="noioo.Bean">

    </bean>

</beans>

❗注意:

是按照UserBean中屬性的類型來匹配的.

運行結果

Hello World

Process finished with exit code 0
相關文章
相關標籤/搜索