spring框架學習(三)

1、Spring自動組件掃描

Spring 提供組件掃描(component scanning)功能。它能從指定的classpath裏自動掃描、偵測和實例化具備特定註解的組件。前端

基本的註解是@Component,@Name它標識一個受Spring管理的組件。其餘特定的註解有@Repository、@Service和@Controller,它們分別標識了持久層註解、業務層註解和控制層註解的組件。java

1.@Component,@PostConstruct,PreDestroy註解掃描

1.1)在配置文件添加自動組件掃描配置web

             <!-- 組件掃描    自動 掃描com.spring包以及子包下全部的組件類-->
             <context:component-scan base-package="com.spring"></context:component-scan>

1.2)新建一個TestComponentScan類 分別添加一個無參構造器,一個初始化方法和一個銷燬回調方法(@PostConstruct和PreDestroy註解分別用於指定初始化和銷燬回調方法。初始化和銷燬還能夠經過配置文件init-method,destroy-method屬性來執行初始化和銷燬《注意:只有單例模式纔會spring纔會自動調用銷燬方法》)spring

package com.spring.dao;

import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import org.springframework.stereotype.Component; @Component public class TestComponentScan { public TestComponentScan() { System.out.println("-------------實例化對象-------------"); } @PostConstruct public void init(){ System.out.println("-------------初始化對象-------------"); } @PreDestroy public void destroy(){ System.out.println("-------------銷燬對象-------------"); } }

1.3)在測試類添加testComponentScan方法設計模式

@Test
    public void testComponentScan(){ String con = "applicationContext.xml"; AbstractApplicationContext ac = new ClassPathXmlApplicationContext(con); TestComponentScan tcs = ac.getBean("testComponentScan",TestComponentScan.class); System.out.println(tcs); ac.close(); }

1.4)控制檯輸出咱們寫的打印信息就說明自動組件掃描成功了緩存

2.@Scope註解

Spring容器最初提供了兩種bean的Scope類型:1.@Scope("singleton"),2@Scope("prototype"),默認類型爲Singleton。可是2.0發佈後新增了三種scope類型request、session和global session,這三種只能在web 應用中才可使用。(後面三種暫時沒用過不詳細看了)服務器

request:每次http請求將會有各自的bean實例,相似於prototype。 session

session:在一個http session中,一個bean定義對應一個bean實例。app

global session:在一個全局的http session中,一個bean定義對應一個bean實例。典型狀況下,僅在使用portlet context的時候有效。框架

2.1)singletonprototype的區別

Singleton:當一個bean的做用域設置爲singleton時,那麼Spring IOC容器只會存在一個共享bean實例,而且全部對bean的請求,只要id與該bean定義相匹配,則只會返回bean的同一實例。換言之,當把一個bean定義設置爲singleton做用域時,Spring IOC容器只會建立該bean定義的惟一實例。這個單一實例會被存儲到單例緩存(singleton cache)中,而且全部針對該bean的後續請求和引用都將返回被緩存的對象實例。
***這裏要注意的是singleton做用域和GOF設計模式中的單例是徹底不一樣的,單例設計模式表示一個ClassLoader中只有一個class存在,而這裏的singleton則表示一個容器對應一個bean,也就是說當一個bean被標識爲singleton時候,spring的IOC容器中只會存在一個該bean。***

Prototype:prototype做用域部署的bean,每一次請求(將其注入到另外一個bean中,或者以程序的方式調用容器的getBean()方法)都會產生一個新的bean實例,至關與一個new的操做,對於prototype做用域的bean,有一點很是重要,那就是Spring不能對一個prototype bean的整個生命週期負責,容器在初始化、配置、裝飾或者是裝配完一個prototype實例後,將它交給客戶端,隨後就對該prototype實例漠不關心了。
      無論何種做用域,容器都會調用全部對象的初始化生命週期回調方法,而對prototype而言,任何配置好的析構生命週期回調方法都將不會被調用。清除prototype做用域的對象並釋聽任何prototype bean所持有的昂貴資源,都是客戶端代碼的職責。(讓Spring容器釋放被singleton做用域bean佔用資源的一種可行方式是,經過使用bean的後置處理器,該處理器持有要被清除的bean的引用。)

2.2)寫一個測試方法測試一下singleton只建立一個實例,而prototype每次調用都會建立一個新的實例

2.2.1在TestComponnetScan類中添加@Scope註解

@Scope("singleton")

2.2.2)在測試方法中,再調用一次getBean()方法,而且判斷這兩個對象知否指向同一個

TestComponentScan tcs2 = ac.getBean("testComponentScan",TestComponentScan.class);
        System.out.println(tcs==tcs2);

2.2.3)Junit運行,能夠從控制檯看出只實例化了一次,而且兩個對象指向同一實例

2.2.4)修改Scope註解爲prototype模式

2.2.5)Junit運行,能夠從控制檯看出調用兩次getBean,實例化,初始化了兩次,而且兩個對象指向不是同一實例

2、SpringMVC

MVC模式簡介:M:Model模型。Model的職責是負責業務邏輯。包含兩層:業務數據和業務處理邏輯。好比實體類,Dao,Service都屬於Model層

                     V:view視圖。View的職責是負責顯示頁面和用戶交互(收集用戶信息)。屬於視圖的組件是不包含業務邏輯和控制邏輯的JSP。

                     C:Controller控制器。控制器是Model層和View層的橋樑用於控制流程。

1.Spring Web MVC

Spring web MVC是Spring框架一個很是重要的功能模塊。實現了MVC結構,便於簡單,快速的開發MVC結構的Web程序。Spring web MVC 提供了API的封裝Web開發中經常使用的功能。簡化了Web開發過程。

1.1).Spring Web MVC的核心組件

1>DispatcherServlet(控制器請求入口)

2>HandllerMapping(控制器請求派發)

3>Controller(控制器,請求處理流程)

4>ModelAndVie(模型,封裝 業務處理結果和視圖)

5>ViewResolver(視圖,示圖顯示處理器)

1.2)Spring Web MVC的處理流程

1>用戶向服務器發送請求,請求被Spring 前端控制Servelt DispatcherServlet捕獲;
2>DispatcherServlet對請求URL進行解析,獲得請求資源標識符(URI)。而後根據該URI,調用HandlerMapping得到該Handler配置的全部相關的對象(包括Handler對象以及             Handler對象對應的攔截器),最後以HandlerExecutionChain對象的形式返回;
3>DispatcherServlet 根據得到的Handler,選擇一個合適的HandlerAdapter。( 附註:若是成功得到HandlerAdapter後,此時將開始執行攔截器的preHandler(...)方法)
4>提取Request中的模型數據,填充Handler入參,開始執行Handler(Controller)。 在填充Handler的入參過程當中,根據你的配置,Spring將幫你作一些額外的工做:
           HttpMessageConveter: 將請求消息(如Json、xml等數據)轉換成一個對象,將對象轉換爲指定的響應信息
           數據轉換:對請求消息進行數據轉換。如String轉換成Integer、Double等
           數據根式化:對請求消息進行數據格式化。 如將字符串轉換成格式化數字或格式化日期等
           數據驗證: 驗證數據的有效性(長度、格式等),驗證結果存儲到BindingResult或Error中
5>Handler執行完成後,向DispatcherServlet 返回一個ModelAndView對象;
6> 根據返回的ModelAndView,選擇一個適合的ViewResolver(必須是已經註冊到Spring容器中的ViewResolver)返回給DispatcherServlet ;
7>ViewResolver 結合Model和View,來渲染視圖
8> 將渲染結果返回給客戶端。
相關文章
相關標籤/搜索