【轉】SpringMVC、Spring的Bean

1、簡述Spring

Spring是一個輕量級的Java 開發框架。他使用基本的JavaBean來完成之前只可能由EJB【Enterprise JavaBean】完成的事情。html

    簡單來講,Spring是一個輕量級的控制反轉(IoC)面向切面(AOP)的容器框架。java

2、簡述SpringMVC

若是說Spring是一個工具箱,那SpringMVC就是其中的一個扳手。Spring MVC是Spring提供的一個強大而靈活的web框架。藉助於多樣的註解,Spring MVC提供了幾乎是POJO【Plain Ordinary Java Object,普通JavaBeans】的開發模式,使得控制器的開發和測試更加簡單。web

SpringMVC利用反射機制原理出現的註解就是爲了解決配置大量的配置文件問題spring

反射機制:在運行狀態中,對於任意一個類,都可以知道這個類的全部屬性和方法;對於任意一個對象,都可以調用它的任意方法和屬性;這種動態獲取信息以及動態調用對象方法的功能稱爲java語言的反射機制】json

SpringMVC經常使用的一些註解

  • @Controller  -- 聲明控制器
  • @Repository -- 用於註解dao層
  • @RequestMapping("**")  -- 聲明URL
  • @Autowired -- 業務接口注入
  • @Resource和@Autowired -- 都是作bean的注入時使用
  • @Component -- 至關於通用的註解,當不知道類 歸到哪一個層時使用,慎用
  • @ModelAttribute和 @SessionAttributes -- 傳遞保存數據
  • @RequestParam -- 用於在後臺控制層獲取參數
  • @ResponseBody -- 當控制層方法返回的數據不是頁面,而是其餘某種格式的數據時(如json、xml等)使用
  • ......

3、SpringMVC工做原理

    

  • (1)、客戶端發出一個http請求給web服務器,web服務器對http請求進行解析,若是匹配DispatcherServlet的請求映射路徑(在web.xml中指定),web容器將請求轉交給DispatcherServlet;
    • DispatcherServlet是框架的控制器,一個具體類,它經過運行時的上下文對象來初始化
  • (2)、DipatcherServlet接收到這個請求以後將根據請求的信息(包括URL、Http方法、請求報文頭和請求參數Cookie等)以及HandlerMapping的配置找處處理請求的處理器Handler;
  • (3)-(4)、將處理權交給找到的Handler(Handler將具體的處理進行封裝),再由具體的HandlerAdapter適配器對Handler進行具體的調用;
  • (5)、Handler對數據處理完成之後將返回一個 ModelAndView()對象 給DispatcherServlet;
  • (6)、Handler返回的ModelAndView()只是一個邏輯視圖並非一個正式的視圖,DispatcherSevlet經過ViewResolver將邏輯視圖轉化爲真正的視圖View;
  • (7)、Dispatcher經過Model解析出ModelAndView()中的參數進行解析最終展示出完整的view並返回給客戶端。

這樣就完成了 一次http請求 到 響應。服務器

 

4、Spring的Bean 自動裝配Autowire

官方給出的定義是:Spring IoC容器能夠自動裝配(autowire)相互協做bean之間的關聯關係。session

所以,若是可能的話,能夠自動讓Spring經過檢查BeanFactory中的內容,來替咱們指定bean的協做者(其餘被依賴的bean)。因爲autowire能夠針對單個bean進行設置,所以可讓有些bean使用autowire,有些bean不採用。app

autowire的方便之處在減小或者消除屬性或構造器參數的設置,這樣能夠給咱們的配置文件減減肥,咱們少寫幾個 <ref ="...">。框架

能夠先熟悉下什麼是Spring的Bean,參考第五項。工具

5、SpringMVC的Bean

    如下內容主要來自於:Spring(二)Bean入門

--------------------------------開始------------------------------------------

1、BeanFactory介紹

1.一、Bean

  • 在Spring技術中是基於組件的
  • 最基本了是最經常使用的單元
  • 其實實例保存在Spring的容器當中

Bean一般被定義在配置文件當中,Bean實例化由Spring的Ioc容器進行管理,Bean的實例能夠經過Beanfactory進行訪問,實際上大部分J2EE應用,Bean是經過ApplicationContext來訪問的,ApplicationContext是BeanFactory的子接口,功能要比BeanFactory強大許多

1.二、BeanFactory做用

  • 配置、建立以及管理Bean對象
  • 維持Bean對象之間的依賴關係
  • 負責Bean對象的生命週期

    BeanFactory經常使用方法:

  • containsBean(String beanname)
  • Object getBean(String beanName)

    一般使用XmlBeanFactory類來實現

1.三、ApplicationContext

  • 讀取Bean定義文件
  • 維護Bean之間的依賴關係
  • 國際化的支持
  • 資源文件的讀取getRource()方法能夠輕鬆讀取Rource對象
  • 事件傳播
  • 多配置文件加載

2、Bean定義

2.一、在配置文件中配置bean

  • <beans/>是Sring配置文件的根節點
  • 一個<beans/>節點裏面能夠有多個<bean>節點
  • 兩個屬性
    • id:惟一的標識符,Spring對bean的管理以及bean之間這種依賴關係都需這個屬性
    • class:指明該bean的具體實現類,這裏不能是接口(能夠是接口實現類)

2.二、建立Bean

  • Bean的命名:按照Java中的命名規範便可,使用清晰的,描述性的,一致的命名規範;
  • 查找Bean的順序:id --> name --> 類名
    • 查找某個Bean對象時,首先根據id進行查找,將其他做爲Bean的默認名稱,
    • 若是ID屬性不存在,則根據Name屬性進行查找(將其中的第一個名稱做爲默認的名稱)
    • 若是ID和NAME都不存在根據 類的名稱 進行查找
  • 建立Bean的步驟:建立XML文件 --> 寫入配置信息 --> 生成Bean類 --> 加入Bean到配置文件

3、Bean注入

3.一、基本類型和String

  • 用到Value元素
  • XML解析器以String類型解析出數據

若是屬性不是String類型,屬性值會經過PropertyEditors轉換爲其餘類型

3.二、注入Bean

 -ref元素進行標識 

Ref元素一般有兩個屬性:

bean:指定不在同一個XML文件中的bean的id

<bean id="test" class="com.pb.test">
<property name="user">
<ref bean="其餘的bean的id"/>
</property>
</bean>

local:指定在同一個XML文件中的bean的id

<bean id="test" class="com.pb.test">
<property name="user">
<ref bean="相同的XML文件中的bean的id"/>
</property>
</bean>

value和ref的區別:

使用ref元素,可讓Spring在部署時驗證依賴的Bean是否真實存在

使用value元素,進行指定僅在建立Bean實例時作驗證,會致使錯誤的延時出現,並且還會帶來額外的類型轉制開銷

3.三、集合注入

List:

<bean id="test" class="com.pb.test">
        <property name="lists">
        <list>
        <value>1</value>
        <value>2</value>
        <value>3</value>
        </list>
        </property>
    </bean>

Map:

<bean id="test" class="com.pb.test">
        <property name="map">
            <map>
                <entry key="key1">
                    <value>value1</value>
                </entry>
                <entry key="key2">
                    <value>key2</value>
                </entry>
            </map>
        </property>
    </bean>

props:

<bean id="test" class="com.pb.test">
<property name="props">
<props>
<prop key="key1">value1</prop>
<prop key="key2">value2</prop>
</props>
</property>
</bean>

set:

< property  name ="interest" >    
             < set >    
                 < value > 唱歌 </ value >    
                 < value > 跳舞 </ value >    
                 < value > 書法 </ value >    
             </ set >    
    </ property >   

3.四、自動綁定

經過autowire屬性來設置

  • no:默認的。默認爲不綁定
  • byName:根據屬性名稱自動進行綁定
  • byType:根據屬性類型自動進行綁定

4、Bean的做用域

  • singleton/單實例模式:spring容器只會存在一個共享的bean實例,而且全部針對該bean的請求只會返回同一個bean實例;
  • propertype/no-singleton:對每一次針對該bean的請求都會生成一個新的bean實例。 至關於java中的new 操做。定義爲propertype的bean其生命週期很長,不易回收,一般要額外的處理;
  • request:針對每一次的http請求都會產生一個新的bean實例,Bean僅在當前的http request範圍內有效;
  • session:針對每一次的http請求都會產生一個新的bean實例,Bean僅在當前的http session範圍內有效。

-------------------------------結束--------------------------------------------

 

6、Spring獲取Bean的方式

方法一:在初始化時保存ApplicationContext對象

ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml"); 
ac.getBean("beanId");

說明:這種方式適用於採用Spring框架的獨立應用程序,須要程序經過配置文件手工初始化Spring的狀況。

 

方法二:經過Spring提供的工具類獲取ApplicationContext對象

ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc); 
ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc); 
ac1.getBean("beanId"); 
ac2.getBean("beanId");

說明:這種方式適合於採用Spring框架的B/S系統,經過ServletContext對象獲取ApplicationContext對象,而後在經過它獲取須要的類實例。上面兩個工具方式的區別是,前者在獲取失敗時拋出異常,後者返回null。

 

方法三:繼承自抽象類ApplicationObjectSupport

說明:抽象類ApplicationObjectSupport提供getApplicationContext()方法,能夠方便的獲取ApplicationContext。

Spring初始化時,會經過該抽象類的setApplicationContext(ApplicationContext context)方法將ApplicationContext 對象注入。

 

方法四:繼承自抽象類WebApplicationObjectSupport

說明:相似上面方法,調用getWebApplicationContext()獲取WebApplicationContext

 

方法五:實現接口ApplicationContextAware

說明:實現該接口的setApplicationContext(ApplicationContext context)方法,並保存ApplicationContext 對象。Spring初始化時,會經過該方法將ApplicationContext對象注入。

如下是實現ApplicationContextAware接口方式的代碼,前面兩種方法相似:

public class SpringContextUtil implements ApplicationContextAware {  
    // Spring應用上下文環境  
    private static ApplicationContext applicationContext;  
    /** 
     * 實現ApplicationContextAware接口的回調方法,設置上下文環境 
     *  
     * @param applicationContext 
     */  
    public void setApplicationContext(ApplicationContext applicationContext) {  
        SpringContextUtil.applicationContext = applicationContext;  
    }  
    /** 
     * @return ApplicationContext 
     */  
    public static ApplicationContext getApplicationContext() {  
        return applicationContext;  
    }  
    /** 
     * 獲取對象 
     *  
     * @param name 
     * @return Object
     * @throws BeansException 
     */  
    public static Object getBean(String name) throws BeansException {  
        return applicationContext.getBean(name);  
    }  
}

雖然,spring提供的後三種方法能夠實如今普通的類中繼承或實現相應的類或接口來獲取spring 的ApplicationContext對象,可是在使用是必定要注意實現了這些類或接口的普通Java類必定要在Spring 的配置文件applicationContext.xml文件中進行配置。不然獲取的ApplicationContext對象將爲null。

 

方法六:經過Spring提供的ContextLoader

WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();
wac.getBean(beanID);

最後提供一種不依賴於servlet,不須要注入的方式。

可是須要注意一點,在服務器啓動時,Spring容器初始化時,不能經過如下方法獲取Spring 容器,細節能夠查看spring源碼org.springframework.web.context.ContextLoader。

相關文章
相關標籤/搜索