1. 程式人生 > >spring—Bean配置

spring—Bean配置

Spring是一個開源的框架,其目標是簡化java的開發。為了降低Java開發的複雜性,Spring有如下的特性:

>> 基於POJO的輕量級和最小侵入性程式設計

>> 通過依賴注入和麵向介面程式設計實現鬆耦合

>> 基於切面和慣例進行宣告式程式設計

>> 通過切面和模板減少樣板式程式碼

Spring的六大模組:核心Spring容器、SpringAOP模組、資料訪問與整合、Web和遠端呼叫以及測試模組

Spring中還有其他模組,例如Spring WebServiceSpring SecuritySpring Web FlowSpring .Net

等等。Spring致力於簡化企業級Java開發,促進程式碼鬆耦合,成功的關鍵在於依賴注入和AOP切面。依賴注入和AOPSpring中最核心的部分。

** 配置並使用第一個bean

準備一個Bean,在這個類中有nameage屬性

publicclass Person {

private String name;

privateintage;

public Person() {}

public Person(String name, intage) {                                                                                                                                                                                

this.name = name;

this.age = age;

}

public String getName() {

returnname;

}

publicvoid setName(String name) {

this.name = name;

}

publicint getAge() {

returnage;

}

publicvoid setAge(intage) {

this.age = age;

}

@Override

public String toString() {

return"Person [name=" + name + ", age=" + age

+ "]";

}

}

建立一個如下的beans.xml

xmlns全名是:xml Name Space[xml名稱空間]在這個檔案配置檔案中如果你要加入其它的標籤,在這個頭部加入名稱空間和對應的schema約束檔案的地址即可。

Person類的Bean配置如下:

<bean id="person" class="com.wxh.blog.Person">

<property name="name" value="wxh"></property>                                                                                                                                                         

<property name="age" value="22"></property>

</bean>

Bean中的id是唯一識別符號,class是指向要配置bean的類全名。

在這個例子中用的是setter方法注入。Property中的name一定要和class中的屬性的名字一樣,才能正確匹配,value就是對應的值。

使用構造器注入

<bean id="person" class="com.wxh.blog.Person">

<constructor-arg name="name" value="wxh"></constructor-arg>                                                                                                                                   

<constructor-arg name="age" value="22"></constructor-arg>

</bean>

<constructor-arg>還有index[代表匹配建構函式中第幾個引數]type[代表value的型別]ref[代表對其他bean的引用]

使用bean

publicstaticvoid main(String[] args) {

ApplicationContext ac=new ClassPathXmlApplicationContext("beans-example.xml");                                                                                                   

Person person=(Person) ac.getBean("person");

System.out.println(person.toString());

}

ApplictionContext:應用上下文介面,派生與BeanFactoryBeanFactorySpring的核心但是功能比較單一。

ApplicationContext介面的實現類有三個:

>> ClassPathXmlApplicationContext: 從類路徑下的XML配置檔案中載入上下文定義。

>> FileSystemXmlApplicationContext: 讀取檔案系統下的XML配置檔案並載入上下文定義。

>> XmlWebApplictionContext: 讀取Web應用下的XML配置檔案並裝載上下文。[Web中使用]

** 引用其他bean和內部beanz注入

利用ref就可以實現引用其他的bean

首先新增一個Car

publicclass Car {

private String brand;

privateintprice;

public Car() {}

public Car(String brand, intprice) {                                                                                                                                                                                   

this.price = price;

this.brand = brand;

}

public String getBrand() {

returnbrand;

}

publicvoid setBrand(String brand) {

this.brand = brand;

}

publicint getPrice() {

returnprice;

}

publicvoid setPrice(intprice) {

this.price = price;

}

@Override

public String toString() {

return"Car [brand=" + brand + ", price=" + price + "]";

}  

}

配置CarBean

<bean id="car" class="com.wxh.blog.Car">

<constructor-arg value="吉利" ></constructor-arg>

<constructor-arg value="120000"></constructor-arg>                                                                                                                                                    

</bean>

利用ref引用carbean

<bean id="person" class="com.wxh.blog.Person">

<constructor-arg name="name" value="wxh"></constructor-arg>                                                                                                                                  

<constructor-arg name="age" value="22"></constructor-arg>

<constructor-arg name="car" ref="car"></constructor-arg>

</bean>

執行結果:Person [name=wxh, age=22, car=Car[brand=吉利, price=120000]]

內部Bean的使用如下:內部bean不能被其他bean使用所以用的不多。

<bean id="person" class="com.wxh.blog.Person">

<property name="name" value="wxh"></property>

<property name="age" value="22"></property>

<property name="car">

<bean class="com.wxh.blog.Car">

<property name="brand" value="吉利"></property>                                                                                                                                                

<property name="price" value="20000"></property>

</bean>

</property>

</bean>

** 利用p名稱空間裝配屬性

先引入名稱空間p,再使用

p:屬性名=”或者 p:屬性名-ref=””[引用]

<bean id="person" class="com.wxh.blog.Person"

       p:name="wxh" p:age="22" p:car-ref="car"></bean>

** 集合的裝配

先引入:xmlns:util="http://www.springframework.org/schema/util"

這裡主要使用listmap、和props

>> list的使用

<util:list>

<bean class="com.wxh.blog.Car">

<property name="brand" value="奧迪"></property>

<property name="price" value="320000"></property>                                                                                                                                              

</bean>

<bean class="com.wxh.blog.Car">

<property name="brand" value="比亞迪"></property>

<property name="price" value="100000"></property>

</bean>

<bean class="com.wxh.blog.Car">

<property name="brand" value="吉利"></property>

<property name="price" value="120000"></property>

</bean>

</util:list>

>> map的使用

<util:map>

<entry key="favorite" value="籃球"></entry>

<entry key="motto" value="no pains, no gains"></entry>                                                                                                                                             

</util:map>

>> props的使用

<props>

<prop key="user">root</prop>

<prop key="password">root</prop>

<prop key="jdbcUrl">jdbc:mysql///test</prop>

<prop key="driverClass">com.mysql.jdbc.Driver</prop>                                                                                                                                                 

</props>

最後說一下空值的裝配,應該是這樣的:<property name=”name”><null/></property>

** bean的作用域

所有的bean預設都是單例的,但是可以通過scope[作用域]來設定。

在單例模式中當xml配置檔案被ApplicationContext載入後就會產生一個bean的例項,以後索取bean的例項,都是獲取的同一個例項。可以把scope的值設定為prototype[原型],這個在檔案被載入後就不會馬上產生bean,每次取出一個bean的例項就建立一個新的。

在大多數情況下,我們只需要預設的singleton即可。

** bean的生命週期

Spring IOC容器對bean的生命週期的管理過程是:

>> 通過構造器或者工廠方法建立Bean例項

>> 設定Bean的屬性

>> 呼叫Bean的初始化方法

>> 使用Bean

>> 關閉容器,呼叫Bean的銷燬方法

如何使用init-methoddestroy-method?

先在class中新增一個initdestroy方法

publicvoid init(){

System.out.println("init......");

}

publicvoid destroy(){

System.out.println("destroy......");                                                                                                                                                                                       

}

再在xml配置檔案中配置

<bean id="person" class="com.wxh.blog.Person" init-method="init" destroy-method="destroy" p:name="wxh" p:age="22" p:car-ref="car"></bean>             

** 通過autowire自動裝配

通過指定autowire屬性可以讓容器管理JavaBean自動注入依賴的物件。這樣可以大大的簡化配置檔案的複雜度和程式碼量。

autowire可選引數常用的包括:

>> No: 預設值,預設是不啟動自動裝配的

>> byname: 通過bean屬性的名字來查詢Bean依賴的物件並注入

>> byType: 通過Bean屬性的型別查詢Bean依賴的物件並注入

<bean id="car" class="com.wxh.blog.Car">

<constructor-arg value="吉利" ></constructor-arg>

<constructor-arg value="120000"></constructor-arg>

</bean>

<bean id="person1" class="com.wxh.blog.Person" p:name="wxh" p:age="22" autowire="byName"></bean>                                                                     

<bean id="person2" class="com.wxh.blog.Person" p:name="wxh" p:age="22" autowire="byType"></bean>

** Spring Bean之間的關係

Spring Bean之間的關係有繼承[parent]和依賴[depends-on]

繼承:子Bean可以繼承父Bean就像Java中一樣,子類的屬性值可以覆蓋父類。可以使用parent關鍵字繼承。

<!-- parent bean -->

<bean id="parent" class="com.wxh.blog.Person" p:car-ref="car"></bean>

<!-- extends bean -->

<bean id="children1" class="com.wxh.blog.Person"  p:name="wxh" p:age="22" parent="parent"></bean>                                                                          

<bean id="children2" class="com.wxh.blog.Person"  p:name="wqc" p:age="21" parent="parent"></