SpringIOC核心容器bean
阿新 • • 發佈:2018-12-26
Spring IOC是為了將類解耦
//建立一個類
public class HelloWorld {
private String name;
public void setName(String name) {
System.out.println("設定屬性方法");
this.name = name;
}
public HelloWorld() {
System.out.println("初始化構造器");
}
public void hello() {
System. out.println("hello " + name);
}
}
Spring的核心容器bean
通過XML檔案配置bean物件
<?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.xsd" >
<!--bean配置檔案
bean標籤:用於spring讀取配置檔案後建立物件-->
<!--屬性:id:物件的唯一標識;class:要建立物件的全限定類名-->
<bean id="helloWorld" class="spring.HelloWorld">
<!-- 設定值-->
<property name="name" value="spring"></property>
</bean>
</beans>
建立spring IOC 容器的兩種方式
ApplicationContext
:它是BeanFactory的子物件下的子物件;建立物件時,採用立即載入策略。(當讀取完xml配置檔案,配置檔案中所有的物件都已經建立完成了);適合物件只使用一次,單例模式的場景。
public class ReadBean {
public static void main(String[] args) {
//通過讀取類路徑下的配置檔案,建立spring的IOC容器。要求配置檔案必須在類路徑下
ApplicationContext ac = new ClassPathXmlApplicationContext("spring-config.xml");
//通過讀取檔案系統中的配置檔案,建立spring容器。要求配置檔案在檔案系統中即可
//FileSystemXmlApplicationContext:
//從容器中獲取bean例項
HelloWorld helloWorld = (HelloWorld) ac.getBean("helloWorld");
//呼叫方法
helloWorld.hello();
}
}
BeanFactory
:它是Spring IOC容器的頂層介面;建立物件時,採用延遲載入策略(當真正要從容器中獲取物件時才會建立),適合使用多次物件的場景。
bean物件的三種建立方式
bean物件,即通過spring建立的類物件
- 通過建構函式建立
預設情況下,在spring配置檔案中寫了一個bean標籤,並提供了class屬性,spring就會呼叫該類的預設建構函式建立物件。如果沒有預設建構函式,則物件建立失敗。(無建構函式,預設不帶引數;如果寫了帶引數的將沒有預設不帶引數的建構函式)
<bean id="helloWorld" class="spring.HelloWorld">
//不寫建構函式,預設無引數
public HelloWorld(String s) {
System.out.println("初始化構造器");
}
//No default constructor found
- 通過靜態工廠建立
工廠類中提供靜態方法,返回要使用的bean物件
<!--靜態工廠建立
factory-method指定建立bean物件的方法-->
<bean id="staticFactoryHello" class="spring.Factory" factory-method="getBean"></bean>
//靜態工廠
public class Factory {
public static IHelloWorld getBean(){
return new HelloWorld();
}
}
//執行
HelloWorld staticFactoryHello = (HelloWorld) ac.getBean("staticFactoryHello");
staticFactoryHello.hello();
- 通過例項工廠建立
工廠類中提供普通方法,返回要使用的bean物件
<!--例項工廠建立
factoty-bean 指定建立bean物件的工廠bean的ID-->
<bean id="instanceFactory" class="spring.InstanceFactory"></bean>
<bean id="instanceFactoryHello" factory-bean="instanceFactory" factory-method="getInstanceBean"></bean>
//例項工廠
public class InstanceFactory {
public IHelloWorld getInstanceBean(){
return new HelloWorld();
}
}
//除錯
HelloWorld instanceFactoryHello = (HelloWorld) ac.getBean("instanceFactoryHello");
instanceFactoryHello.hello();
bean物件的作用範圍
通過scope
屬性設定
<bean id="helloWorld" class="spring.HelloWorld" scope="singleton"></bean>
- singleton:單例的,預設值;在讀取配置檔案時建立;多次獲取仍然是同一個物件。
- prototype:多例的;在每次獲取時建立新物件;每次獲取都不同。
- request:web專案,一次請求中使用
- session:web專案,一次會話範圍
- global-sesssion:web專案,應用在portlet環境,否則相當於session
bean物件的生命週期
在bean物件建立和銷燬時,會執行HelloWorld
類中的init()
和destory()
<bean id="helloWorld" class="spring.HelloWorld"
init-method="init" destroy-method="destory"></bean>
-
單例物件
出生:容器建立時
活著:只要容器存在,物件就存在
死亡:容器銷燬,物件消亡 -
多例物件
出生:每次從容器中獲取物件時,容器建立
活著:只要物件在使用過程中,就一直存在
死亡:當物件長時間不使用,並且沒有其他物件引用,由java的垃圾回收器回收