Spring(二)——注入物件

Myosotis發表於2018-02-14

首先明確xml檔案中的一些配置:
id和name:表示標識這個<bean>節點,name可以有特殊字元
scopebean的生存範圍,有singleton(單例,預設)、prototype(非單例)、request、session、globalsession
class表示關聯的類檔名稱(包名 + 類名)
value注入基本資料型別或字串
ref注入一個物件引用
factory-bean呼叫的工廠Bean例項
factory-method呼叫的工廠方法
<property>節點可以呼叫類中的setter方法,name對應引數名稱,value對應引數值。
<constructor-arg>節點可以呼叫類中的構造器,name對應引數名稱,value對應引數值。

一:通過建構函式建立物件。

1.無參建構函式+setter方法注入值

package com.spring.bean;
public class Person {

    private String name;
    private Integer id;
    
    public String getName() {
        return name;
    }

    public void setName(String name) {//呼叫這個
        this.name = name;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {//呼叫這個
        this.id = id;
    }
}

XML配置:

    <!--呼叫了無參建構函式-->
    <bean class="com.spring.bean.Person" id="person">
   
        <property name="name" value="LiuChunfu"></property><!--呼叫了setter方法-->
        <property name="id" value="125"></property>
    </bean>
    
</beans>

2 利用有參建構函式直接注入

package com.mc.base.learn.spring.bean;

public class Person {

    private String name;
    private Integer id;
    
    public Person(String name, Integer id) {//呼叫這個
        super();
        this.name = name;
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }
}

xml配置:

    <bean class="com.spring.bean.Person" id="person">
    <!--有參建構函式注入-->
    <!--呼叫有引數建構函式,通過<constructor-arg>標籤注入引數-->
        <constructor-arg name="id" value="123"></constructor-arg>
        <constructor-arg name="name" value="LiuChunfu"></constructor-arg>
    </bean>
    
</beans>

二.靜態工廠建立(使用靜態方法)

靜態工廠的物件,在容器載入的時候就被建立了。

    public static Person createPerson(Integer id,String name){
    return new Person(name,id);
    }

xml:

<!--靜態的工廠方法核心是class+factory-method,直接呼叫類方法-->
 <bean id="person" class="com.spring.factory.PersonStaticFactory" factory-method="createPerson">
    <!--通過property標籤向createPerson傳遞引數 -->
    <property name="name" value="LiuChunfu"></property>
    <property name="id" value="125"></property>
</bean>

三、通過例項工廠方式建立物件

例項工廠就是通過例項來呼叫物件,但是所得到的物件最終也是單例模式。例項工廠和靜態工廠建立的物件都是單例模式,兩者的區別就是建立物件的實際不同,靜態工廠是在建立容器的時候就建立了,例項工廠是在呼叫方法的時候才建立。


public class PersonFactory {
    //非靜態方法返回例項
    public Person createInstance() {
        return new Person();
    }
}

xml:

<!--建立類的工廠Bean例項-->
<bean id="personFactory" class="cn.test.util.PresonFactoryInstance"></bean>
    <!--有了例項之後才能呼叫成員方法-->
    <bean id="person4" factory-bean="personFactory" factory-method="createPerson">
        <property name="name" value="LiuChunfu"></property>
        <property name="id" value="125"></property>
</bean>

四.自動裝配

在bean節點中, 新增autowire屬性來完成自動裝配的操作
1,no : 預設設定 , 表示關閉自動裝配
2,byName : 通過名稱完成自動裝配:
例如: 當前我們容器中存在一個物件, id為book;
而剛好當前的這個person類中有一個名稱為book的屬性
那麼這個時候, 我們的容器, 會自動完成兩個物件的關聯
byName 不會判斷傳入的引數型別是否匹配, 只要名稱相同, 就會強行建立依賴關係 , 導致報錯!

3, byType : 通過型別完成自動裝配
例如: 當前我們容器中存在一個Book類的物件
而剛好我們當前的Person有一個Book型別的屬性
我們的容器, 就會自動完成兩個物件的關聯。如果存在多個同型別物件則報錯
4,constructor 與byType的方式類似,不同之處在於它應用於構造器引數
5,autodetect 通過bean類來決定是使用constructor還是byType方式進行自動裝配。如果發現預設的構造器,那麼將使用byType

相關文章