目錄:
Bean的定義
簡單地說Bean是被Spring容器管理的Java對象,Spring容器會自動完成對Bean的實例化。
其中有如下代碼:
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
context就是一個容器,當然這不是官方最准確的定義,不過初步學習,我們知道這個實例化對象就是個容器就行了。
第二篇隨筆中,配置文件內容如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" 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-3.0.xsd"> <!-- id自己命名,class就是需要注入屬性的類--> <bean id="c" class="Category"> <!-- name就是屬性的名稱,value就是注入到該屬性的值--> <property name="name" value="Hello Word"/> </bean> </beans>
bean定義時的屬性列表如下(摘自w3cschool):
屬性 | 描述 |
---|---|
class | 這個屬性是強制性的,並且指定用來創建 bean 的 bean 類。 |
name | 這個屬性指定唯一的 bean 標識符。在基於 XML 的配置元數據中,你可以使用 ID 和/或 name 屬性來指定 bean 標識符。 |
scope | 這個屬性指定由特定的 bean 定義創建的對象的作用域,它將會在 bean 作用域的章節中進行討論。 |
constructor-arg | 它是用來注入依賴關系的,並會在接下來的章節中進行討論。 |
properties | 它是用來注入依賴關系的,並會在接下來的章節中進行討論。 |
autowiring mode | 它是用來注入依賴關系的,並會在接下來的章節中進行討論。 |
lazy-initialization mode | 延遲初始化的 bean 告訴 IoC 容器在它第一次被請求時,而不是在啟動時去創建一個 bean 實例。 |
initialization 方法 | 在 bean 的所有必需的屬性被容器設置之后,調用回調方法。它將會在 bean 的生命周期章節中進行討論。 |
destruction 方法 | 當包含該 bean 的容器被銷毀時,使用回調方法。它將會在 bean 的生命周期章節中進行討論。 |
Bean的作用域
上面表格中,scope屬性就是用來指定作用域的。其值及描述如下:
作用域 | 描述 |
---|---|
singleton | 在spring IoC容器僅存在一個Bean實例,Bean以單例方式存在,默認值 |
prototype | 每次從容器中調用Bean時,都返回一個新的實例,即每次調用getBean()時,相當於執行newXxxBean() |
request | 每次HTTP請求都會創建一個新的Bean,該作用域僅適用於WebApplicationContext環境 |
session | 同一個HTTP Session共享一個Bean,不同Session使用不同的Bean,僅適用於WebApplicationContext環境 |
global-session | 一般用於Portlet應用環境,該運用域僅適用於WebApplicationContext環境 |
下面我們就來寫兩個常用的作用域。
首先准備一個類,這個類不用變
public class Category { //屬性 private String name; //設置該屬性的方法 public void setName(String name){ this.name=name; } //獲取該屬性的方法 public void getName(){ System.out.println(name); } }
singleton作用域:
配置文件:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" 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-3.0.xsd"> <!-- id自己命名,class就是需要注入屬性的類--> <bean id="c" class="Category" scope="singleton"> </bean> </beans>
測試類
public class TestSpring { public static void main(String[] args) { //Spring的API ApplicationContext。applicationContext.xml就是自己創建的配置文件 ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml"); //c就是后面配置文件的id Category category=(Category)context.getBean("c"); //不在配置文件中設置,用set方法設置屬性的值 category.setName("第一次設置"); category.getName(); //第二個對象 Category category1=(Category)context.getBean("c"); //不用設置,直接獲取屬性的值 category1.getName(); } }
最后的結果是:
第一次設置
第一次設置
兩次輸出相同的內容,說明id為c的bean只有1個,兩次返回的都是同一個值。
prototype作用域:
配置文件中的scope改成prototype。其他所有代碼不變,包括測試類
最后輸出:
第一次設置
null
說明容器每次調用getBean時返回的是一個新的實例,所以第一次設置對第二個對象無效。