使用Spring: 第一是使用它的IOC功能,在解耦上達到了配置級別。 第二是使用它對數據庫訪問事務相關的封裝。 第三就是各類其餘組件與Spring的融合,在Spring中更加方便快捷的繼承其餘一些組件。前端
spring的事務聲明有兩種方式,編程式和聲明式。spring主要是經過「聲明式事務」的方式對事務進行管理,即在配置文件中進行聲明,經過AOP將事務切面切入程序,最大的好處是大大減小了代碼量。java
答:git
在Spring框架中,一旦把一個bean歸入到Spring IoC容器之中,這個bean的生命週期就會交由容器進行管理,通常擔當管理者角色的是BeanFactory或ApplicationContext。認識一下Bean的生命週期活動,對更好的利用它有很大的幫助。程序員
歸納來講主要有四個階段:實例化,初始化,使用,銷燬。github
ApplicationContext容器中,Bean的生命週期流程如上圖所示,流程大體以下:web
1.首先容器啓動後,會對scope爲singleton且非懶加載的bean進行實例化,面試
2.按照Bean定義信息配置信息,注入全部的屬性,spring
3.若是Bean實現了BeanNameAware接口,會回調該接口的setBeanName()方法,傳入該Bean的id,此時該Bean就得到了本身在配置文件中的id,數據庫
4.若是Bean實現了BeanFactoryAware接口,會回調該接口的setBeanFactory()方法,傳入該Bean的BeanFactory,這樣該Bean就得到了本身所在的BeanFactory,編程
5.若是Bean實現了ApplicationContextAware接口,會回調該接口的setApplicationContext()方法,傳入該Bean的ApplicationContext,這樣該Bean就得到了本身所在的ApplicationContext,
6.若是有Bean實現了BeanPostProcessor接口,則會回調該接口的postProcessBeforeInitialzation()方法,
7.若是Bean實現了InitializingBean接口,則會回調該接口的afterPropertiesSet()方法,
8.若是Bean配置了init-method方法,則會執行init-method配置的方法,
9.若是有Bean實現了BeanPostProcessor接口,則會回調該接口的postProcessAfterInitialization()方法,
10.通過流程9以後,就能夠正式使用該Bean了,對於scope爲singleton的Bean,Spring的ioc容器中會緩存一份該bean的實例,而對於scope爲prototype的Bean,每次被調用都會new一個新的對象,期生命週期就交給調用方管理了,再也不是Spring容器進行管理了
11.容器關閉後,若是Bean實現了DisposableBean接口,則會回調該接口的destroy()方法,
12.若是Bean配置了destroy-method方法,則會執行destroy-method配置的方法,至此,整個Bean的生命週期結束
答:能夠在定義Bean屬性時,經過
<list> / <set> / <map> / <props>
分別爲其注入列表、集合、映射和鍵值都是字符串的映射屬性。
答:
Resource 接口是 Spring 資源訪問策略的抽象,它自己並不提供任何資源訪問實現,具體的資源訪問由該接口的實現類完成——每一個實現類表明一種資源訪問策略。 Spring 爲 Resource 接口提供了以下實現類:
最常被使用的 ApplicationContext 接口實現:
在默認狀況下,spring的ApplicationContext容器在啓動時,自動實例化全部singleton的Bean並緩存於容器中.雖然啓動時會花費一些時間,但帶來兩個好處:首先對Bean提早的實例化操做會及早發現一些潛在的配置問題.其次Bean以緩存的方式保存,當運行時使用到該Bean時就無須再實例化了,加快了運行效率.若是用戶不但願在容器啓動時提早實例化singleton的Bean,能夠經過lazy-init屬性進行控制.
在默認狀況下,spring容器在啓動時不實例化prototype的Bean.此外,spring容器將prototype的Bean交給調用者後,就再也不管理它的生命週期.
每次HTTP請求都會建立一個新的Bean,HTTP請求處理完畢後,銷燬這個Bean.該做用域僅適用於webApplicationContext環境.
同一個HTTP session共享一個Bean,不一樣HTTP session使用不一樣的Bean,當HTTP Session結束後,實例才被銷燬.該做用域僅適用於webApplicationContext環境
同一個全局session共享一個Bean,通常用於portlet應用環境,該做用域僅適用於webApplicationContext環境.
IOC是Inversion of Control的縮寫,「控制反轉」之意。 軟件系統在沒有引入IOC容器以前,對象A依賴於對象B,那麼對象A在初始化或者運行到某一點的時候,本身必須主動去建立對象B或者使用已經建立的對象B。不管是建立仍是使用對象B,控制權都在本身手上。 軟件系統在引入IOC容器以後,這種情形就徹底改變了,因爲IOC容器的加入,對象A與對象B之間失去了直接聯繫,因此,當對象A運行到須要對象B的時候,IOC容器會主動建立一個對象B注入到對象A須要的地方。 經過先後的對比,咱們不難看出來:對象A得到依賴對象B的過程,由主動行爲變爲了被動行爲,控制權顛倒過來了,這就是「控制反轉」這個名稱的由來。
2004年,Martin Fowler探討了同一個問題,既然IOC是控制反轉,那麼究竟是「哪些方面的控制被反轉了呢?」,通過詳細地分析和論證後,他得出了答案:「得到依賴對象的過程被反轉了」。控制被反轉以後,得到依賴對象的過程由自身管理變爲了由IOC容器主動注入。 依賴注入(DI)和控制反轉(IOC)是從不一樣的角度的描述的同一件事情,就是指經過引入IOC容器,利用依賴關係注入的方式,實現對象之間的解耦。
下降類之間耦合,可維護性比較好,很是便於進行單元測試,便於調試程序和診斷故障。 模塊之間經過接口交流,互不干擾,便於團隊開發。 可複用性好 模塊具備熱插拔特性,可直接修改配置文件。
引入了第三方IOC容器,生成對象的步驟變得有些複雜 IOC容器生成對象是經過反射方式,在運行效率上有必定的損耗。 額外的配置工做。
答:AOP(Aspect-Oriented Programming)指一種程序設計範型,該範型以一種稱爲切面(aspect)的語言構造爲基礎,切面是一種新的模塊化機制,用來描述分散在對象、類或方法中的橫切關注點(crosscutting concern)。
答:」橫切關注」是會影響到整個應用程序的關注功能,它跟正常的業務邏輯是正交的,沒有必然的聯繫,可是幾乎全部的業務邏輯都會涉及到這些關注功能。一般,事務、日誌、安全性等關注就是應用中的橫切關注功能。
答: a. 鏈接點(Joinpoint):程序執行的某個特定位置(如:某個方法調用前、調用後,方法拋出異常後)。一個類或一段程序代碼擁有一些具備邊界性質的特定點,這些代碼中的特定點就是鏈接點。Spring僅支持方法的鏈接點。 b. 切點(Pointcut):若是鏈接點至關於數據中的記錄,那麼切點至關於查詢條件,一個切點能夠匹配多個鏈接點。Spring AOP的規則解析引擎負責解析切點所設定的查詢條件,找到對應的鏈接點。 c. 加強(Advice):加強是織入到目標類鏈接點上的一段程序代碼。Spring提供的加強接口都是帶方位名的,如:BeforeAdvice、AfterReturningAdvice、ThrowsAdvice等。不少資料上將加強譯爲「通知」,這明顯是個詞不達意的翻譯,讓不少程序員困惑了許久。
說明: Advice在國內的不少書面資料中都被翻譯成」通知」,可是很顯然這個翻譯沒法表達其本質,有少許的讀物上將這個詞翻譯爲」加強」,這個翻譯是對Advice較爲準確的詮釋,咱們經過AOP將橫切關注功能加到原有的業務邏輯上,這就是對原有業務邏輯的一種加強,這種加強能夠是前置加強、後置加強、返回後加強、拋異常時加強和包圍型加強。 d. 引介(Introduction):引介是一種特殊的加強,它爲類添加一些屬性和方法。這樣,即便一個業務類本來沒有實現某個接口,經過引介功能,能夠動態的爲該業務類添加接口的實現邏輯,讓業務類成爲這個接口的實現類。 e. 織入(Weaving):織入是將加強添加到目標類具體鏈接點上的過程,AOP有三種織入方式:①編譯期織入:須要特殊的Java編譯期(例如AspectJ的ajc);②裝載期織入:要求使用特殊的類加載器,在裝載類的時候對類進行加強;③運行時織入:在運行時爲目標類生成代理實現加強。Spring採用了動態代理的方式實現了運行時織入,而AspectJ採用了編譯期織入和裝載期織入的方式。 f. 切面(Aspect):切面是由切點和加強(引介)組成的,它包括了對橫切關注功能的定義,也包括了對鏈接點的定義。
答:
答:首先須要在Spring配置文件中增長以下配置:
<context:component-scan base-package="org.example"/>
而後能夠用@Component、@Controller、@Service、@Repository註解來標註須要由Spring IoC容器進行對象託管的類。這幾個註解沒有本質區別,只不過@Controller一般用於控制器,@Service一般用於業務邏輯類,@Repository一般用於倉儲類(例如咱們的DAO實現類),普通的類用@Component來標註。
Spring MVC的工做原理以下圖所示: ① 客戶端的全部請求都交給前端控制器DispatcherServlet來處理,它會負責調用系統的其餘模塊來真正處理用戶的請求。 ② DispatcherServlet收到請求後,將根據請求的信息(包括URL、HTTP協議方法、請求頭、請求參數、Cookie等)以及HandlerMapping的配置找處處理該請求的Handler(任何一個對象均可以做爲請求的Handler)。 ③在這個地方Spring會經過HandlerAdapter對該處理器進行封裝。 ④ HandlerAdapter是一個適配器,它用統一的接口對各類Handler中的方法進行調用。 ⑤ Handler完成對用戶請求的處理後,會返回一個ModelAndView對象給DispatcherServlet,ModelAndView顧名思義,包含了數據模型以及相應的視圖的信息。 ⑥ ModelAndView的視圖是邏輯視圖,DispatcherServlet還要藉助ViewResolver完成從邏輯視圖到真實視圖對象的解析工做。 ⑦ 當獲得真正的視圖對象後,DispatcherServlet會利用視圖對象對模型數據進行渲染。 ⑧ 客戶端獲得響應,多是一個普通的HTML頁面,也能夠是XML或JSON字符串,還能夠是一張圖片或者一個PDF文件。
Application contexts提供一種方法處理文本消息,一個一般的作法是加載文件資源(好比鏡像),它們能夠向註冊爲監聽器的bean發佈事件。另外,在容器或容器內的對象上執行的那些不得不禁bean工廠以程序化方式處理的操做,能夠在Application contexts中以聲明的方式處理。Application contexts實現了MessageSource接口,該接口的實現以可插拔的方式提供獲取本地化消息的方法。
你兩種依賴方式均可以使用,構造器注入和Setter方法注入。最好的解決方案是用構造器參數實現強制依賴,setter方法實現可選依賴。
Spring beans 是那些造成Spring應用的主幹的java對象。它們被Spring IOC容器初始化,裝配,和管理。這些beans經過容器中配置的元數據建立。好比,以XML文件中 的形式定義。
Spring 框架定義的beans都是單件beans。在bean tag中有個屬性」singleton」,若是它被賦爲TRUE,bean 就是單件,不然就是一個 prototype bean。默認是TRUE,因此全部在Spring框架中的beans 缺省都是單件。
一個Spring Bean 的定義包含容器必知的全部配置元數據,包括如何建立一個bean,它的生命週期詳情及它的依賴。
這裏有三種重要的方法給Spring 容器提供配置元數據。
當定義一個 在Spring裏,咱們還能給這個bean聲明一個做用域。它能夠經過bean 定義中的scope屬性來定義。
如,當Spring要在須要的時候每次生產一個新的bean實例,bean的scope屬性被指定爲prototype。
另外一方面,一個bean每次使用的時候必須返回同一個實例,這個bean的scope 屬性 必須設爲 singleton。
Spring框架支持如下五種bean的做用域:
缺省的Spring bean 的做用域是Singleton.
不,Spring框架中的單例bean不是線程安全的。
當一個bean僅被用做另外一個bean的屬性時,它能被聲明爲一個內部bean,爲了定義inner bean,在Spring 的 基於XML的 配置元數據中,能夠在或元素內使用 元素,內部bean一般是匿名的,它們的Scope通常是prototype。
裝配,或bean 裝配是指在Spring 容器中把bean組裝到一塊兒,前提是容器須要知道bean的依賴關係,如何經過依賴注入來把它們裝配到一塊兒。
Spring 容器可以自動裝配相互合做的bean,這意味着容器不須要和配置,能經過Bean工廠自動處理bean之間的協做。
###自動裝配有哪些侷限性 ?
自動裝配的侷限性是:
重寫: 你仍需用 和 配置來定義依賴,意味着總要重寫自動裝配。 基本數據類型:你不能自動裝配簡單的屬性,如基本數據類型,String字符串,和類。 模糊特性:自動裝配不如顯式裝配精確,若是有可能,建議使用顯式裝配。
能夠。
基於Java的配置,容許你在少許的Java註解的幫助下,進行你的大部分Spring配置而非經過XML文件。
以@Configuration 註解爲例,它用來標記類能夠當作一個bean的定義,被Spring IOC容器使用。另外一個例子是@Bean註解,它表示此方法將要返回一個對象,做爲一個bean註冊進Spring應用上下文。
相對於XML文件,註解型的配置依賴於經過字節碼元數據裝配組件,而非尖括號的聲明。
開發者經過在相應的類,方法或屬性上使用註解的方式,直接組件類中進行配置,而不是使用xml表述bean的裝配關係。
註解裝配在默認狀況下是不開啓的,爲了使用註解裝配,咱們必須在Spring配置文件中配置 元素。
這個註解代表bean的屬性必須在配置的時候設置,經過一個bean定義的顯式的屬性值或經過自動裝配,若@Required註解的bean屬性未被設置,容器將拋出BeanInitializationException。
@Autowired 註解提供了更細粒度的控制,包括在何處以及如何完成自動裝配。它的用法和@Required同樣,修飾setter方法、構造器、屬性或者具備任意名稱和/或多個參數的PN方法。
當有多個相同類型的bean卻只有一個須要自動裝配時,將@Qualifier 註解和@Autowire 註解結合使用以消除這種混淆,指定須要裝配的確切的bean。
使用SpringJDBC 框架,資源管理和錯誤處理的代價都會被減輕。因此開發者只需寫statements 和 queries從數據存取數據,JDBC也能夠在Spring框架提供的模板類的幫助下更有效地被使用,這個模板叫JdbcTemplate (例子見這裏here)
JdbcTemplate 類提供了不少便利的方法解決諸如把數據庫數據轉變成基本數據類型或對象,執行寫好的或可調用的數據庫操做語句,提供自定義的數據錯誤處理。
Spring對數據訪問對象(DAO)的支持旨在簡化它和數據訪問技術如JDBC,Hibernate or JDO 結合使用。這使咱們能夠方便切換持久層。編碼時也不用擔憂會捕獲每種技術特有的異常。
在Spring中有兩種方式訪問Hibernate:
控制反轉 Hibernate Template和 Callback。 繼承 HibernateDAOSupport提供一個AOP 攔截器。
用Spring的 SessionFactory 調用 LocalSessionFactory。集成過程分三步:
配置the Hibernate SessionFactory。 繼承HibernateDaoSupport實現一個DAO。 在AOP支持的事務中裝配。
Spring支持兩種類型的事務管理:
編程式事務管理:這意味你經過編程的方式管理事務,給你帶來極大的靈活性,可是難維護。 聲明式事務管理:這意味着你能夠將業務代碼和事務管理分離,你只需用註解和XML配置來管理事務。
它爲不一樣的事務API 如 JTA,JDBC,Hibernate,JPA 和JDO,提供一個不變的編程模式。 它爲編程式事務管理提供了一套簡單的API而不是一些複雜的事務API如 它支持聲明式事務管理。 它和Spring各類數據訪問抽象層很好得集成。
大多數Spring框架的用戶選擇聲明式事務管理,由於它對應用代碼的影響最小,所以更符合一個無侵入的輕量級容器的思想。聲明式事務管理要優於編程式事務管理,雖然比編程式事務管理(這種方式容許你經過代碼控制事務)少了一點靈活性。
AOP核心就是切面,它將多個類的通用行爲封裝成可重用的模塊,該模塊含有一組API提供橫切功能。好比,一個日誌模塊能夠被稱做日誌的AOP切面。根據需求的不一樣,一個應用程序能夠有若干切面。在Spring AOP中,切面經過帶有@Aspect註解的類實現。
關注點是應用中一個模塊的行爲,一個關注點可能會被定義成一個咱們想實現的一個功能。橫切關注點是一個關注點,此關注點是整個應用都會使用的功能,並影響整個應用,好比日誌,安全和數據傳輸,幾乎應用的每一個模塊都須要的功能。所以這些都屬於橫切關注點。
鏈接點表明一個應用程序的某個位置,在這個位置咱們能夠插入一個AOP切面,它其實是個應用程序執行Spring AOP的位置。
通知是個在方法執行前或執行後要作的動做,其實是程序執行時要經過SpringAOP框架觸發的代碼段。
Spring切面能夠應用五種類型的通知:
before:前置通知,在一個方法執行前被調用。 after: 在方法執行以後調用的通知,不管方法執行是否成功。 after-returning: 僅當方法成功完成後執行的通知。 after-throwing: 在方法拋出異常退出時執行的通知。 around: 在方法執行以前和以後調用的通知。
切入點是一個或一組鏈接點,通知將在這些位置執行。能夠經過表達式或匹配的方式指明切入點。
引入容許咱們在已存在的類中增長新的方法和屬性。
被一個或者多個切面所通知的對象。它一般是一個代理對象。也指被通知(advised)對象。
代理是通知目標對象後建立的對象。從客戶端的角度看,代理對象和目標對象是同樣的。
BeanNameAutoProxyCreator DefaultAdvisorAutoProxyCreator Metadata autoproxying
織入是將切面和到其餘應用類型或對象鏈接或建立一個被通知對象的過程。
織入能夠在編譯時,加載時,或運行時完成。
在這種狀況下,切面由常規類以及基於XML的配置實現。
Spring 配備構建Web 應用的全功能MVC框架。Spring能夠很便捷地和其餘MVC框架集成,如Struts,Spring 的MVC框架用控制反轉把業務對象和控制邏輯清晰地隔離。它也容許以聲明的方式把請求參數和業務對象綁定。
Spring的MVC框架是圍繞DispatcherServlet來設計的,它用來處理全部的HTTP請求和響應。
WebApplicationContext 繼承了ApplicationContext 並增長了一些WEB應用必備的特有功能,它不一樣於通常的ApplicationContext ,由於它能處理主題,並找到被關聯的servlet。
控制器提供一個訪問應用程序的行爲,此行爲一般經過服務接口實現。控制器解析用戶輸入並將其轉換爲一個由視圖呈現給用戶的模型。Spring用一個很是抽象的方式實現了一個控制層,容許用戶建立多種用途的控制器。
該註解代表該類扮演控制器的角色,Spring不須要你繼承任何其餘控制器基類或引用Servlet API。
該註解是用來映射一個URL到一個類或一個特定的方處理法上。
原文:Java架構筆記
免費Java高級資料須要本身領取,涵蓋了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo高併發分佈式等教程,一共30G。
傳送門: https://mp.weixin.qq.com/s/JzddfH-7yNudmkjT0IRL8Q