spring—Bean配置
Spring是一個開源的框架,其目標是簡化java的開發。為了降低Java開發的複雜性,Spring有如下的特性:
>> 基於POJO的輕量級和最小侵入性程式設計
>> 通過依賴注入和麵向介面程式設計實現鬆耦合
>> 基於切面和慣例進行宣告式程式設計
>> 通過切面和模板減少樣板式程式碼
Spring的六大模組:核心Spring容器、Spring的AOP模組、資料訪問與整合、Web和遠端呼叫以及測試模組
Spring中還有其他模組,例如Spring WebService、Spring Security、Spring Web Flow、Spring .Net
** 配置並使用第一個bean
準備一個Bean,在這個類中有name和age屬性
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:應用上下文介面,派生與BeanFactory,BeanFactory是Spring的核心但是功能比較單一。
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 + "]"; } } |
配置Car的Bean
<bean id="car" class="com.wxh.blog.Car"> <constructor-arg value="吉利" ></constructor-arg> <constructor-arg value="120000"></constructor-arg> </bean> |
利用ref引用car的bean
<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"
這裡主要使用list、map、和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-method和destroy-method?
先在class中新增一個init和destroy方法
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"></ |