能夠把Spring容器看作一個大型的工廠,而Spring容器中的Bean就是該工廠的產品java
Spring容器支持兩種格式的配置文件,分別爲Properties文件格式和XML文件格式。spring
bean的配置數組
一個<bean>元素中包含不少屬性,具體以下。session
id:是一個Bean的惟一 標識符, Spring容器對Bean的配置、管理都經過該屬性來完成app
name:Spring容器一樣能夠經過此屬性對容器中的Bean進行配置和管理,name屬性中能夠爲Bean指定多個名稱,每一個名稱之間用逗號或分號隔開(因爲Bean的id屬性在Spring容器中是惟一的,若是想給Bean添加別名函數
或者想使用些不合法的XML字符,如「/」,就能夠經過name屬性進行設定)post
class:該屬性指定了Bean的具體實現類,它必須是一個完整的類名,使用類的全限定名。spa
scope:用來設定Bean實例的做用域,其屬性值有singleton(單例)、prototype(原型)、request.session和global Session。其默認值是singletonprototype
constructor arg: bean 元素的子元素,可使用此元素傳人構造參數進行實例化。該元素的index屬性指定構造參數的序號(從0開始),type屬性指定構造參數的類型,其參數值能夠經過ref屬性或者value 屬性直接指定,也能夠經過ref 或value 元素指定3d
數值能夠經過ref屬性或者value 屬性直接指定,也能夠經過ref 或value素指定
property:bean元素的子元素.用於調用Bean實例中的Setter方法完成屬性賦值從而完成依賴注入。該元素的name屬性指定Bean實例中的相應屬性名,屬性值可經過ref或value屬性直接指定。
ref:property、constructor-arg等元素的子元素,該元素中的 bean屬性用於指定對Bean工廠中某個Bean實例的引用。
value: property 、constructor-arg等元素的子元素,用來直接指定一個 常量值。
list::用於封裝List或數組類型的依賴注人。
set:用於封裝Set類型屬性的依賴注人。
map:用於封裝Map類型屬性的依賴注人。
entry::map元素的子元素,用於設置一一個鍵值對。其key屬性指定字符串類型的鍵值,ref或value 子元素指定其值。
在配置文件文件中,一般一個普通Bean只須要定義Id(或者name)和class兩個屬性便可,定義Bean的方式以下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd"> <bean id="bean" class="cn.itcast.bean"></bean> </beans>
Bean的實例化
在面向對象的程序中,要想使用某個對象,就須要先實例化這個對象。在Spring中,實例化Bean有三種方式,分別爲構造器實例化、靜態工廠實例化和實例化工廠方式實例化。
構造器實例化 構造器實例化是指Spring容器經過Bean對應的類中默認的構造函數來實例化Bean。
1.Bean.java
package cn.itcast.instance.controller public class Bean{ }
2.Bean.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd"> <bean id="bean" class="cn.itcast.instance.countroller.Bean"></bean> </beans>
3.InstanceTest.java
public class InstanceTest{ @Test public void Test{ ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
}}
靜態工廠方式實例化
1.MyBeanFactory.java
package cn.itcast.instance.static_factory public class MyBeanFactory{ public static Bean createBean(){ return new Bean; } }
2.Bean.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd"> <bean id="bean" class="cn.itcast.instance.static_factory.MyBeanFactory" factory-method = "createBean"></bean> </beans>
3.InstanceTest.java
public class InstanceTest{ @Test public void Test{ ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); }}
實例工廠方式實例化
1.MyBeanFactory.java
package cn.itcast.instance.static_factory public class MyBeanFactory{ public Bean createBean(){ return new Bean; } }
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd"> <bean id="MyBeanFactory" class="cn.itcast.instance.factory.MyBeanFactory"/> <bean id = "bean" factory-bean = "myBeanFactory" factory-method = "createBean"></bean> </beans>
3.InstanceTest.java
public class InstanceTest{ @Test public void Test{ ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); }}
Bean的做用域
1.singleton:單例模式,使用singleton定義的Bean在Spring容器中將只有一個實例,也就是說,不管有多少個Bean引用它,始終指向同一個對象。這也是spring容器默認的做用域。
2.prototype:原型模式.每次經過Spring容器獲取的prototype定義的Bean時,容器都將建立一個新的Bean實例。
3.request::在一-次HTTP請求中,容器會返回該Bean的同一個實例。而對不一樣的HTTP請求則會產生一個新的Bean, 並且該Bean僅在當前HTTP Request 內有效。
4.session:session: 在一一次HTTP Session中,容器會返回該Bean的同一個實例。而對不一樣的HTTP請求則會產生一個新的Bean,並且該Bean僅在當前HTTP Session內有效。
5.globalSession:在-個全局的HTTP Session中,容器會返回該Bean 的同一個實例。僅在使用protlet context 時有效。
Bean的生命週期
spring容器能夠管理singleton做用域下Bean的生命週期,在此做用域下,Spring可以精確的知道該Bean什麼時候被建立,什麼時候初始化完成,以及什麼時候被銷燬,而對於prototype做用
域的Bean,spring只負責建立,當容器建立了Bean實例後,Bean的實例就交給客戶端代碼來管理,spring容器不在跟蹤其生命週期
(1) Spring 實例化Bean。
(2)利用依賴注人來配置Bean中的全部屬性值。
(3)若是Bean實現了BeanNameAware接口,則Spring調用Bean的setBeanName()方法傳入當前Bean的ID值。
(4)若是Bean實現了BeanFactoryAware接口,則Spring調用setBeanFactory()方法傳入當前工廠實例的引用。.
(5)若是Bean實現了ApplicationContextAware接口,則Spring調用setApplicationContext()方法傳入當前ApplicationContext實例的引用。
(6)若是Bean實現了BeanPostProcessor 接口,則Spring 會調用postProcessBeforeInitialzation()方法。
(7)若是Bean實現了InitializingBean 接口,則Spring會調用afterpropertiesSet()方法。
(8)若是在配置文件中經過init-method屬性指定了初始化方法,則調用該初始化方法。
(9)若是Bean實現了BeanPostProcessor 接口,則Spring 會調用postProcessAfterInitialization()方法。
(10)此時, Bean實例化完成,就能夠被使用了,它將一直存在於Spring容器中,直到被銷燬。
(11)若是Bean實現了DisposableBean接口,則Spring會調用destory()方法。
(12)若是在配置文件中經過destory-method屬性指定了Bean的銷燬方法,則可調用該方法。