1. 程式人生 > >Spring基本功能詳解

Spring基本功能詳解

tex factor oid out 負責 sch bsp 初始化 pub

一、SpringIOC

  Spring的控制反轉:把對象的創建,初始化,銷毀的過程交給SpringIOC容器來做,由Spring容器控制對象的生命周期。

  1.1 啟動Spring容器的方式:

  (1)加載classpath下的spring配置文件。其中xml可以是全路徑,也可以是classpath的書寫方式,該方式下Spring的配置文件必須放置於classpath路徑下。

ApplicationContext ac = new  ClassPathXmlApplicationContext("classpath:jyk.xml");

(2)加載文件系統下的配置文件。其中xml是存放於某個具體文件目錄下的Spring配置文件。

ApplicationContext ac = new FileSystemXmlApplicationContext("d:\\jyk.xml");

  1.2 從Spring容器中提取對象的方式。

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context
="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd "> <bean id="person" class
="com.jyk.spring.simpletest.Person"> </bean> </beans>
package com.jyk.spring.simpletest;

public class Person {

    public Person() {
        System.out.println("fuck...............");
    }
    
    public void printInfo(){
        System.out.println("hello..............");
    }
}
package com.jyk.spring.simpletest;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {

    public static void main(String[] args) {
        ApplicationContext ac = new 
                ClassPathXmlApplicationContext("classpath:jyk.xml");
        //根據beanid獲取相應的對象並強制轉換
        Person p = (Person)ac.getBean("person");
        p.printInfo();
    }
}

二、Spring對象的常用創建方式

  2.1 無參構造函數

<bean id="person" class="com.jyk.spring.simpletest.Person"></bean>

  2.2 有參構造函數

  <!-- 按照方法參數的順序賦值 -->
    <bean id="person" class="com.jyk.spring.simpletest.Person">
        <constructor-arg index="0" value="tom"></constructor-arg>
        <constructor-arg index="1" value="12"></constructor-arg>
    </bean>
    
    <!-- 按照方法參數的類型賦值 -->
    <bean id="person" class="com.jyk.spring.simpletest.Person">
        <constructor-arg type="java.lang.String" value="tom"></constructor-arg>
        <constructor-arg type="java.lang.Double" value="12"></constructor-arg>
    </bean>
        
    <!-- 按照方法參數的名稱賦值 -->
    <bean id="person" class="com.jyk.spring.simpletest.Person">
        <constructor-arg name="name" value="tom"></constructor-arg>
        <constructor-arg name="age" value="12"></constructor-arg>
    </bean> 

  2.3 靜態工廠

<bean id="personFactory" class="com.jyk.spring.simpletest.PersonFactory" factory-method="createPerson"> </bean>
package com.jyk.spring.simpletest;

public class PersonFactory {

    public static Person createPerson(){
        return new Person();
    }
}

三、Spring對象的scope

3.1 singleton(默認值)

   在Spring容器中一個Bean定義只有一個共享的對象實例。在一個普通的只有beanid和class配置的bean定義中,默認情況下是Spring容器初始化時便初始化該bean。

   但我們可以在bean節點中添加lazy-init="true"來延遲加載bean。這樣只有在第一次獲取bean時才會有初始化該bean。

<bean id="person" class="com.jyk.spring.simpletest.Person" lazy-init="true"></bean>

  如果想對所有的bean設置延遲初始化,可以在beans節點設置該屬性值,如下

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        " default-lazy-init="true">

3.2 prototype

  當一個bean的scope為prototype時,該bean允許被多次創建(每使用一次就實例化一次),Spring無法對prototype的bean的生命周期負責,因此以為著持有prototype的對象並釋放的責任,都需由客戶端負責。

<bean id="person" class="com.jyk.spring.simpletest.Person" scope="prototype"></bean>

3.3 request

  每次http請求都會有各自的bean實例創建,即一個bean實例對應一次http請求,該作用域僅在基於web的spring applicationcontext場景下有效。

3.4 session

  一個bean實例對應一個http session,該作用域僅在基於web的spring applicationcontext場景下有效。

3.5 global session

四、Spring對象的初始化與銷毀

  Spring默認在啟動時對所有singleton bean進行實例化,即ApplicationContext提前地創建並配置好所有singleton bean。提前實例化意味著對啟動的性能有所影響,但長遠來看是好事,因為一旦某個對象的創建出現了問題,在初始化時便能及時發現並修復,而不是等到調用該對象時才報錯(lazy-init="false"的情況)。

  Spring初始化和銷毀bean時,有時需要人工介入處理一些邏輯,Spring提供了初始化和銷毀bean時的自定義方法配置,init-method和destory-method,當容器初始化該bean時調用init方法,當該bean對象中容器中刪除時調用destroy方法。

<bean id="person" class="com.jyk.spring.simpletest.Person" init-method="init" destroy-method="destroy"></bean>

五、Spring的依賴註入(DI)

  

  

Spring基本功能詳解