Spring 提供組件掃描(component scanning)功能。它能從指定的classpath裏自動掃描、偵測和實例化具備特定註解的組件。前端
基本的註解是@Component,@Name它標識一個受Spring管理的組件。其餘特定的註解有@Repository、@Service和@Controller,它們分別標識了持久層註解、業務層註解和控制層註解的組件。java
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)控制檯輸出咱們寫的打印信息就說明自動組件掃描成功了緩存
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)singleton和prototype的區別
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,實例化,初始化了兩次,而且兩個對象指向不是同一實例
MVC模式簡介:M:Model模型。Model的職責是負責業務邏輯。包含兩層:業務數據和業務處理邏輯。好比實體類,Dao,Service都屬於Model層
V:view視圖。View的職責是負責顯示頁面和用戶交互(收集用戶信息)。屬於視圖的組件是不包含業務邏輯和控制邏輯的JSP。
C:Controller控制器。控制器是Model層和View層的橋樑用於控制流程。
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的處理流程