Spring基本功能詳解
一、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基本功能詳解