1. 程式人生 > >Spring(三)之Ioc、Bean、Scope講解

Spring(三)之Ioc、Bean、Scope講解

不同 速度 .com style xmla path 創建對象 spa 其中

Spring容器是Spring Framework的核心。容器將創建對象,將它們連接在一起,配置它們,並管理從創建到銷毀的整個生命周期。Spring容器使用DI來管理組成應用程序的組件。這些對象稱為Spring Beans。

容器通過讀取提供的配置元數據獲取有關要實例化,配置和組裝的對象的指令。配置元數據可以由XML,Java註釋或Java代碼表示。下圖表示Spring的工作原理的高級視圖。

一、IOC

Spring IoC容器利用Java POJO類和配置元數據來生成完全配置和可執行的系統或應用程序

技術分享圖片

Spring提供以下兩種不同類型的容器

技術分享圖片

所述的ApplicationContext

容器包括所有功能的BeanFactory容器,因此,通常建議在Bean工廠BeanFactory仍可用於輕量級應用程序,如移動設備或基於applet的應用程序,其中數據量和速度都很重要.

二.Bean

構成應用程序主幹並由Spring IoC容器管理的對象稱為beanbean是一個由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上擴展。

Spring(三)之Ioc、Bean、Scope講解