Spring容器是Spring Framework的核心。容器将建立對象,将它們連接配接在一起,配置它們,并管理從建立到銷毀的整個生命周期。Spring容器使用DI來管理組成應用程式的元件。這些對象稱為Spring Beans。
容器通過讀取提供的配置中繼資料擷取有關要執行個體化,配置群組裝的對象的指令。配置中繼資料可以由XML,Java注釋或Java代碼表示。下圖表示Spring的工作原理的進階視圖。
一、IOC
Spring IoC容器利用Java POJO類和配置中繼資料來生成完全配置和可執行的系統或應用程式

所述的ApplicationContext容器包括所有功能的BeanFactory容器,是以,通常建議在Bean工廠。BeanFactory仍可用于輕量級應用程式,如移動裝置或基于applet的應用程式,其中資料量和速度都很重要.
二.Bean
構成應用程式主幹并由Spring IoC容器管理的對象稱為bean。bean是一個由Spring IoC容器執行個體化,組裝和管理的對象。這些bean是使用您提供給容器的配置中繼資料建立的。例如,以前面章節中已經看到的XML <bean />定義的形式。
Bean定義包含稱為配置中繼資料的資訊,容器需要知道以下内容 -
- 如何建立一個bean
- Bean的生命周期細節
- Bean的依賴關系
所有上述配置中繼資料都轉換為構成每個bean定義的以下屬性集。
Spring配置中繼資料
Spring IoC容器與實際編寫此配置中繼資料的格式完全分離。以下是為Spring容器提供配置中繼資料的三種重要方法 -
- 基于XML的配置檔案。
- 基于注釋的配置
- 基于Java的配置
三、Bean Scope
定義<bean>時,您可以選擇聲明該bean的作用域。例如,要在每次需要時強制Spring生成一個新的bean執行個體,您應該将bean的scope屬性聲明為原型。類似地,如果您希望Spring在每次需要時傳回相同的bean執行個體,則應将bean的scope屬性聲明為singleton。
Spring Framework支援以下五個範圍,其中三個範圍僅在您使用支援Web的ApplicationContext時才可用。
(1)SingleTon
這将bean定義範圍限定為每個Spring IoC容器的單個執行個體(預設)。
(2)Prototype
這将單個bean定義範圍限定為具有任意數量的對象執行個體。
(3)request
這将bean定義範圍限定為HTTP請求。僅在Web感覺Spring ApplicationContext的上下文中有效。
(4)session
這将bean定義範圍限定為HTTP會話。僅在Web感覺Spring ApplicationContext的上下文中有效。
(5)gobal session
這将bean定義範圍限定為全局HTTP會話。僅在Web感覺Spring ApplicationContext的上下文中有效。
示例講解:
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
HelloWorld objA = (HelloWorld) context.getBean("helloWorld");
objA.setMessage("I'm object A");
objA.getMessage();
HelloWorld objB = (HelloWorld) context.getBean("helloWorld");
objB.getMessage();
}
}
Beans.xml
<?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-4.0.xsd">
<bean id = "helloWorld" class = "com.tutorialspoint.HelloWorld" scope="singleton">
</bean>
</beans>
不指定scope,預設是單例的,關于單例模式可以參考我的這篇博文:
單例模式和JDBC另外關于原型,prototype,struts2就是這樣,struts每次執行個體都是不同的action,拿架構作為比較SpringMVC與Struts2的差別:
(1)SpringMVC是方法級别的,Struts2是類級别的;
(2)SpringMVC是單例的,全局共享一個執行個體,比如HttpSession,而Struts2是多例的,每一次執行個體都會産生不同的action;
(3)SpringMVC的入口是servlet,而Struts2的入口是filter;
可以從web.xml的配置可以看出來:
例如SpringMVC在web.xml配置
<servlet>
<description>spring mvc servlet</description>
<servlet-name>springMvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
例如Struts2在web.xm的配置
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
(4)攔截器方面,Struts2有自己的攔截器機制,而SpringMVC主要是利用AOP實作攔截;
struts2攔截機制圖:
(5)SpringMVC內建了Ajax,使用非常友善,隻需一個注解@ResponseBody就可以實作,然後直接傳回響應文本即可,而Struts2攔截器內建了Ajax,在Action中處理時一般必須安裝插件或者自己寫代碼內建進去,使用起來也相對不友善;
(6)SpringMVC驗證支援JSR303,處理起來相對更加靈活友善,而Struts2驗證比較繁瑣,感覺太煩亂;
(7)Spring MVC和Spring是無縫的。從這個項目的管理和安全上也比Struts2高(當然Struts2也可以通過不同的目錄結構和相關配置做到SpringMVC一樣的效果,但是需要xml配置的地方挺多的,與SpringMVC比較,SpringMVC幾乎是零配置);
(8)設計思想上,Struts2更加符合OOP的程式設計思想, SpringMVC就比較謹慎,在servlet上擴充。