什麼是 Spring容器和Bean
Spring
Spring的核心容器就是一個大工廠,所有對象都會被Spring核心容器管理,Spring框架的本質就是,通過XML配置來驅動Java代碼,這樣就可以把原本由Java代碼管理的耦合關係,提取到XMl配置文件中管理,這就實現了,系統中的各組件的解耦有利於後期升級和維護。Spring容器中的一切對象都稱爲Bean,Spring 對Bean沒有任何要求,只要它是Java類即可。
對於Spring框架而言,一切Java對象(只要它是Java類即可)都是Bean。
public class User {
private String name;
//User的無參構造器
public User() {
System.out.println("User的無參構造器被調用");
}
public String getName() {
return name;
}
public void setName(String name) {
System.out.println("調用了User的setName方法");
this.name = name;
}
}
對於<bean ...>
元素,默認以反射方式來調用該類的無參構造器,其class 反射的必須爲實現類並不是接口,對於<property...
它驅動Spring在底層以反射執行一次setter方法,其中的<property...
的name 屬性值決定執行那一個setter方法,每個<property...
元素默認Spring調用一次setter方法。
<!-- 向spring 添加 bean -->
<bean id="user" class="com.test.spring.model.User">
<!-- 控制setName()方法,將"老王"給user.name賦值 -->
<property name="name" value="老王"></property>
</bean>
<!-- 配置名爲:win的bean,其實現類爲:javax.swing.JFrame-->
<bean id="win" class="javax.swing.JFrame"></bean>
<!-- 配置名爲:date的bean,其實現類爲:java.util.Date -->
<bean id="date" class="java.util.Date"></bean>
Spring 常用獲取Bean的方法:
T getBean(String name,Class<T> requireType)
返回requireTypeObjcet getBean(String name)
返回Object類型。(String name)可以是id和別名。
@Test
public void springTest(){
//加載spring配置文件,獲取Sprting容器
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
//根據bean的 id 和 User.class獲取bean(指定了 Bean的類型)
User user = applicationContext.getBean("user",User.class);
System.out.println("獲取spring.xml對User的賦值:"+user.getName());
//設置時間格式
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd") ;
Date date = new Date();
System.out.println("通過new:"+sf.format(date.getTime()));
// 根據bena的id獲取bean,獲取得到的是Objcet類型需要強轉
Date date2 = (Date) applicationContext.getBean("date");
System.out.println("獲取Spring容器裏面的Date:"+sf.format(date2.getTime()));
}
ApplictionContext 與 BeanFactory
Spring容器最基本的接口是BeanFactory 負責配置、創建、管理Bean,它有一個子接口: AnpplicationContext(Spring的上下文),它爭強了Beanfactory的功能。Spring容器還負責管理Bean與Bean之間的依賴關係。
當系統創建ApplicationContext ,默認會初始化所有的singletion Bean包括構造器創建Bean實例,並根據<property...
元素執行setter方法。當系統創建ApplicationContext,前期有比較大的系統開銷,但ApplicationContext被創建完成後,程序後面獲取singletion Bean實例將會擁有比較好的性能。ApplicationContext 包括BeanFactory的全部功能。
@Test
public void BeanFactoryTest(){
/* BeanFactory beanFactory = new ClassPathXmlApplicationContext("spring.xml","bean.xml");
beanFactory.getBean("date");
*/
//加載spring配置文件,多個Spring配置
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml","bean.xml");
applicationContext.getBean("date");
}
BeanFactory對於某些內存非常關鍵的情景使用.
Bean使用
Spring可以看做一個超級大工廠,Spring 容器中的Bean就是該工廠的產品。
Spring框架主要做兩件事:1.開發bean。2.配置bean。對於Spring框架來說,它要做的就是根據配置文件來創建Bean實例,並調用Bean實例的方法完成”依賴注入”——這就是所謂IOC的本質。
Bean的基本使用:
id:確實bean的唯一標識,容器對Bean的管理、訪問、以及該Bean的依賴關係,都通過該屬性完成。Bean的id在Spring容器中都是唯一的。
class: 指定Bean的具體實現類,不是接口。Spring必須知道創建Beand的實現類,而不是接口。在默認的設置中Spring會直接使用new 關鍵字創建該Bean的實例,所有必須提供Bean實現類的類名。
name:指定一個bean實例的標識名,表面將該Bean實例指定爲別名。
alias:指定一個別名。
<!-- 給 person 設置多個別名 -->
<bean id="person" class="com.test.spring.model.Person" name="#aa,@123,abc">
</bean>
<!-- person設置一個別名 -->
<alias name="person" alias="per"/>
Bean的作用域
Single:單例模式,在Spting IoC容器中,Single作用域的Bean將只生產一個實例。
Prototype:多例模式,每次通過容器getBaen()獲取的Bean都講產生一個新的Bean實例。
request:對於一次Htttp請求,request 作用域 Bean將只生產一個實例,在同一次reqestHtttp請求會話中,程序每次得到的總是同一個實例。只有在Web應用中使用Spring時,該作用域纔會真正的生效。
session: 對於一次會話,session作用域的Bean將只生成一個實例。
global:每個全局的HTTP Session 對於一個Bean實例。
當使用:single時:
@Test
public void BeanFactoryTest(){
/* BeanFactory beanFactory = new ClassPathXmlApplicationContext("spring.xml","bean.xml");
beanFactory.getBean("date");
*/
//加載spring配置文件,多個Spring配置
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml","bean.xml");
Person person1 = applicationContext.getBean("person",Person.class);
Person person2 = applicationContext.getBean("person",Person.class);
boolean b = person1 == person2;
System.out.println("對比person1與person2:"+b);
}
當時用Prototype時
Person person1 = applicationContext.getBean("person",Person.class);
Person person2 = applicationContext.getBean("person",Person.class);
boolean b = person1 == person2;
System.out.println("對比person1與person2:"+b);