Spring(三)裝配Bean:手動裝配Bean

    建立應用對象之間的協做關係的行爲一般被稱做裝配,這也是依賴注入的本質。java

    在spring中裝配bean的方式有兩種,手動裝配自動裝配,手動裝配顧名思義就是每個bean都是本身寫到xml裏面,二自動裝配的方式有兩種,按類型裝配和按名字裝配spring


一、手動裝配的例子

有三個類,一個是Person的基類,另兩個類是服務於Person類的分別是Address和Car,先看這三個類:數組

Person.javasession

package com.roger.spring.beans

public class Person {
    private String name;
    private Address address;
    private Car car;
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }
    public Car getCar() {
        return car;
    }
    public void setCar(Car car) {
        this.car = car;
    }
    @Override
    public String toString() {
        return "Person [name=" + name + ", address=" + address + ", car=" + car
                + "]";
    }  
}

Address.javamvc

package com.roger.spring.beans

public class Address { 
    private String city;
    private String street;
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
    public String getStreet() {
        return street;
    }
    public void setStreet(String street) {
        this.street = street;
    }
    @Override
    public String toString() {
        return "Address [city=" + city + ", street=" + street + "]";
    }
}

Car.javaapp

package com.roger.spring.beans

public class Car {
    private String brand;
    private double price;
    public String getBrand() {
        return brand;
    }
    public void setBrand(String brand) {
        this.brand = brand;
    }
    public double getPrice() {
        return price;
    }
    public void setPrice(double price) {
        this.price = price;
    }
    @Override
    public String toString() {
        return "Car [brand=" + brand + ", price=" + price + "]";
    }
}

基於以上3個類進行手動配置xml文件ide

(如下,使用了Spring的命名空間p來裝配屬性,-ref做爲後綴告訴Spring裝配的應該是一個引用而不是字面值)工具

<?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:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd">
 
    <!-- 手動裝配Bean -->
    <bean id="address" class="com.roger.spring.beans.Address"
        p:city="WhuHan" p:street="Bayi"></bean>
         
    <bean id="car" class="com.roger.spring.beans.Car"
        p:brand="Audi" p:price="300000"></bean>
         
    <bean id="person" class="com.roger.spring.beans.Person"
    p:name="Roger" p:address-ref="address" p:car-ref="car"></bean> 
 
     
</beans>

測試測試

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

public class Main {
    @SuppressWarnings("resource")
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        Person person = (Person) ctx.getBean("person");
        System.out.println(person);
    }
 
}


二、xml命名空間

aop 爲聲明切面以及將@AspectJ註解的類代理爲Spring切面提供了配置元素
beans 支持聲明Bean和裝配Bean,是Spring最核心也是最原始的命名空間
context 爲配置Spring應用上下文提供了配置元素,包括自動檢測和自動裝配Bean、注入非Spring直接管理的對象
jee 提供了與Java EE API的集成,例如JNDI和EJB
jms 爲聲明消息驅動的POJO提供了配置元素
lang 支持配置由Groovy、JRuby或BeanShell等腳本實現的Bean
mvc 啓用Spring MVC的能力,例如面向註解的控制器、視圖控制器和攔截器
oxm 支持Spring的對象到XML映射配置
tx 提供聲明式事務配置
util 提供各類各樣的工具類元素,包括把集合配置爲Bean、支持屬性佔位符元素


三、構造器注入

<constructor-arg>元素使用:this

<bean id="address" class="com.roger.spring.beans.Address">
    <constructor-arg value="WhuHan" />
    <constructor-arg value="Bayi" />
</bean>

<bean id="car" class="com.roger.spring.beans.Car">
    <constructor-arg value="Audi" />
    <constructor-arg value="300000" />
</bean>

<bean id="person" class="com.roger.spring.beans.Person"
    <constructor-arg value="Roger" />
    <constructor-arg ref="address" />
    <constructor-arg ref="car" />
</bean>

使用構造器注入的前提是在類中聲明另外一種構造方法:

Address類

public Address(String city, String street){
    this.city = city;
    this.street = street;
}

Person類

public Person(String name, Address address, Car car) {
    this.name = name;
    this.address = address;
    this.car = car;
}


四、setter注入

使用<property>元素來配置Bean,是經過調用屬性的setter方法來注入值的。

<bean id="address" class="com.roger.spring.beans.Address">
    <property name="city" value="WhuHan" />
    <property name="street" value="Bayi" />
</bean>

其中value值得類型能夠是String、數值型、boolean型等,Spring將根據Bean屬性的類型自動判斷value值的正確類型。


引用其餘Bean

<bean id="address" class="com.roger.spring.beans.Address">
    <property name="city" value="WhuHan" />
    <property name="street" value="Bayi" />
</bean>

<bean id="car" class="com.roger.spring.beans.Car">
    <property name="brand" value="Audi" />
    <property name="price" value="300000" />
</bean>

<bean id="person" class="com.roger.spring.beans.Person"
    <property name="name" value="Roger" />
    <property name="address" ref="address" />
    <property name="car" ref="car" />
</bean>


五、Bean的做用域

利用scope屬性來設置

做用域 定義
singleton 在每個Spring容器中,一個Bean定義只有一個對象實例(默認)
prototype 容許Bean的定義能夠被實例化任意次(每次調用都建立一個實例)
request 在一次HTTP請求中,每一個Bean定義對應一個實例,該做用域僅在基於Web的Spring上下文(例如Spring MVC)中才有效
session
在一個HTTP Session中,每一個Bean定義對應一個實例,該做用域僅在基於Web的Spring上下文(例如Spring MVC)中才有效
global-session 在一個全局HTTP Session中,每一個Bean定義對應一個實例,該做用域僅Portlet上下文中才有效

例如:

<bean id="address" class="com.roger.spring.beans.Address" scope="prototype">
    <constructor-arg value="WhuHan" />
    <constructor-arg value="Bayi" />
</bean>


六、初始化和銷燬Bean

利用init-method和destroy-method屬性來設置

<!--Address類須要編寫相應的名爲init()和destroy()方法-->
<bean id="address" class="com.roger.spring.beans.Address" 
    init-method="init" destroy-method="destroy">
    <constructor-arg value="WhuHan" />
    <constructor-arg value="Bayi" />
</bean>

默認的init-method和destroy-method

    若是在上下文定義的不少Bean都擁有相同名字的初始化方法和銷燬方法,就沒有必要爲每個Bean聲明init-method和destroy-method屬性,可使用<beans>元素的default-init-method和default-destroy-method屬性:

<?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:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd"
    default-init-method="init"
    default-destroy-method="destroy">
</beans>


七、內部Bean

內部Bean是定義在其餘Bean內部的Bean,能夠利用<property>或者<constructor-arg>元素來聲明內部Bean。

<bean id="person" class="com.roger.spring.beans.Person"
    <property name="name" value="Roger" />
    <property name="address" ref="address" />
    <property name="car" ref="car" />
    <property name="profession">
        <bean class="com.roger.spring.beans.Profession">
    </property>
</bean>


八、裝配集合

當配置集合類型的屬性時,Spring提供了4種集合配置元素。

集合元素 用途
<list> 裝配類型爲java.util.Collection的任意實現或數組的屬性,容許重複
<set> 裝配類型爲java.util.Collection的任意實現或數組的屬性,不容許重複
<map> 裝配map類型的值,名稱和值能夠是任意類型
<props> 裝配properties類型的值,名稱和值必須都是String型


下面的例子分別展現了<list>、<map>和<props>的配置使用:

前提是假設存在兩個已配置id爲basketball和swim的Bean

A_<list>:假設Person類包括一個集合屬性interestings

private List<Interesting> interestings;

public void setInterestings(List<Interesting> interestings) {
    this.interestings = interestings;
}

xml配置:

<bean id="person" class="com.roger.spring.beans.Person"
    <property name="name" value="Roger" />
    <property name="address" ref="address" />
    <property name="car" ref="car" />
    <property name="interestings">
        <list>
            <ref bean="basketball" />
            <ref bean="swim" />
        </list>
    </property>
</bean>

<list>的設置元素:<ref>、<value>、<bean>、<null/>,固然<list>也能夠包括另外一個<list>造成多維列表。


B_<map>:假設Person類包括一個集合屬性interestings

private Map<String, Interesting> interestings;

public void setInterestings(Map<String, Interesting> interestings) {
    this.interestings = interestings;
}

xml配置:

<bean id="person" class="com.roger.spring.beans.Person"
    <property name="name" value="Roger" />
    <property name="address" ref="address" />
    <property name="car" ref="car" />
    <property name="interestings">
        <map>
            <entry key="BASKETBALL" value-ref="basketball"/>
            <entry key="SWIM" value-ref="swim"/>
        </map>
    </property>
</bean>

<entry>元素的屬性:key、key-ref、value、value-ref


C_<props>:假設Person類包括一個集合屬性interestings

private Map<String, String> interestings;

public void setInterestings(Map<String, String> interestings) {
    this.interestings = interestings;
}

xml配置:

<bean id="person" class="com.roger.spring.beans.Person"
    <property name="name" value="Roger" />
    <property name="address" ref="address" />
    <property name="car" ref="car" />
    <property name="interestings">
        <props>
            <prop key="BASKETBALL">play basketball</prop>
            <prop key="SWIM">go to swim</prop>
        </props>
    </property>
</bean>


注意:

    -  <property>元素用於Bean的屬性注入;

    -  <props>元素用於定義一個java.util.Properties類型的集合值;

    -  <prop>元素用於定義<props>集合的一個成員。


九、裝配空值

爲屬性設置null值,只須要使用<null/>元素

如:

<property name="someNonNullProperty"><null/></property>
相關文章
相關標籤/搜索