建立應用對象之間的協做關係的行爲一般被稱做裝配,這也是依賴注入的本質。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); } }
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; }
使用<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>
利用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>
利用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,能夠利用<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>