1. 程式人生 > >SpringIOC核心容器bean

SpringIOC核心容器bean

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的垃圾回收器回收