如下來自網絡收集,找不到原文出處。這次主要爲了面試收集,但願對你們有所幫助~~~~java
Spring是一個開源的Java EE開發框架。Spring框架的核心功能能夠應用在任何Java應用程序中,但對Java EE平臺上的Web應用程序有更好的擴展性。Spring框架的目標是使得Java EE應用程序的開發更加簡捷,經過使用POJO爲基礎的編程模型促進良好的編程風格。git
因爲spring解決的問題是對單個數據庫進行局部事務處理的,具體的實現首先用spring中的IoC劃分了事務處理單元。而且將對事務的各類配置放到了ioc容器中(設置事務管理器,設置事務的傳播特性及隔離機制)。github
Spring事務處理模塊是經過AOP功能來實現聲明式事務處理的,具體操做(好比事務實行的配置和讀取,事務對象的抽象),用TransactionProxyFactoryBean接口來使用AOP功能,生成proxy代理對象,經過TransactionInterceptor完成對代理方法的攔截,將事務處理的功能編織到攔截的方法中。讀取ioc容器事務配置屬性,轉化爲spring事務處理須要的內部數據結構(TransactionAttributeSourceAdvisor),轉化爲TransactionAttribute表示的數據對象。web
spring委託給具體的事務處理器實現。實現了一個抽象和適配。適配的具體事務處理器:DataSource數據源支持、hibernate數據源事務處理支持、JDO數據源事務處理支持,JPA、JTA數據源事務處理支持。這些支持都是經過設計PlatformTransactionManager、AbstractPlatforTransaction一系列事務處理的支持。 爲經常使用數據源支持提供了一系列的TransactionManager。面試
PlatformTransactionManager實現了TransactionInterception接口,讓其與TransactionProxyFactoryBean結合起來,造成一個Spring聲明式事務處理的設計體系。算法
Spring框架對單例的支持是採用單例註冊表的方式進行實現的,而這個註冊表的緩存是HashMap對象,若是配置文件中的配置信息不要求使用單例,Spring會採用新建實例的方式返回對象實例。spring
你能夠同時使用兩種方式的依賴注入,最好的選擇是使用構造器參數實現強制依賴注入,使用setter方法實現可選的依賴關係。數據庫
概念apache
優勢編程
spring中經常使用的設計模式達到九種,咱們舉例說明:
第一種:簡單工廠
又叫作靜態工廠方法(StaticFactory Method)模式,但不屬於23種GOF設計模式之一。 簡單工廠模式的實質是由一個工廠類根據傳入的參數,動態決定應該建立哪個產品類。 spring中的BeanFactory就是簡單工廠模式的體現,根據傳入一個惟一的標識來得到bean對象,可是否是在傳入參數後建立仍是傳入參數前建立這個要根據具體狀況來定。
第二種:工廠方法(Factory Method)
一般由應用程序直接使用new建立新的對象,爲了將對象的建立和使用相分離,採用工廠模式,即應用程序將對象的建立及初始化職責交給工廠對象。通常狀況下,應用程序有本身的工廠對象來建立bean.若是將應用程序本身的工廠對象交給Spring管理,那麼Spring管理的就不是普通的bean,而是工廠Bean。
第三種:單例模式(Singleton)
保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。
spring中的單例模式完成了後半句話,即提供了全局的訪問點BeanFactory。但沒有從構造器級別去控制單例,這是由於spring管理的是是任意的java對象。
第四種:適配器(Adapter)
在Spring的Aop中,使用的Advice(通知)來加強被代理類的功能。Spring實現這一AOP功能的原理就使用代理模式(一、JDK動態代理。二、CGLib字節碼生成技術代理。)對類進行方法級別的切面加強,即,生成被代理類的代理類, 並在代理類的方法前,設置攔截器,經過執行攔截器重的內容加強了代理方法的功能,實現的面向切面編程。
第五種:包裝器(Decorator)
在咱們的項目中遇到這樣一個問題:咱們的項目須要鏈接多個數據庫,並且不一樣的客戶在每次訪問中根據須要會去訪問不一樣的數據庫。咱們以往在spring和hibernate框架中老是配置一個數據源,於是sessionFactory的dataSource屬性老是指向這個數據源而且恆定不變,全部DAO在使用sessionFactory的時候都是經過這個數據源訪問數據庫。可是如今,因爲項目的須要,咱們的DAO在訪問sessionFactory的時候都不得不在多個數據源中不斷切換,問題就出現了:如何讓sessionFactory在執行數據持久化的時候,根據客戶的需求可以動態切換不一樣的數據源?咱們能不能在spring的框架下經過少許修改獲得解決?是否有什麼設計模式能夠利用呢? 首先想到在spring的applicationContext中配置全部的dataSource。這些dataSource多是各類不一樣類型的,好比不一樣的數據庫:Oracle、SQL Server、MySQL等,也多是不一樣的數據源:好比apache 提供的org.apache.commons.dbcp.BasicDataSource、spring提供的org.springframework.jndi.JndiObjectFactoryBean等。而後sessionFactory根據客戶的每次請求,將dataSource屬性設置成不一樣的數據源,以到達切換數據源的目的。
spring中用到的包裝器模式在類名上有兩種表現:一種是類名中含有Wrapper,另外一種是類名中含有Decorator。基本上都是動態地給一個對象添加一些額外的職責。
第六種:代理(Proxy)
爲其餘對象提供一種代理以控制對這個對象的訪問。 從結構上來看和Decorator模式相似,但Proxy是控制,更像是一種對功能的限制,而Decorator是增長職責。
spring的Proxy模式在aop中有體現,好比JdkDynamicAopProxy和Cglib2AopProxy。
第七種:觀察者(Observer)
定義對象間的一種一對多的依賴關係,當一個對象的狀態發生改變時,全部依賴於它的對象都獲得通知並被自動更新。
spring中Observer模式經常使用的地方是listener的實現。如ApplicationListener。
第八種:策略(Strategy)
定義一系列的算法,把它們一個個封裝起來,而且使它們可相互替換。本模式使得算法可獨立於使用它的客戶而變化。
第九種:模板方法(Template Method)
定義一個操做中的算法的骨架,而將一些步驟延遲到子類中。Template Method
使得子類能夠不改變一個算法的結構便可重定義該算法的某些特定步驟。Template Method
模式通常是須要繼承的。這裏想要探討另外一種對Template Method
的理解。spring中的JdbcTemplate,在用這個類時並不想去繼承這個類,由於這個類的方法太多,可是咱們仍是想用到JdbcTemplate已有的穩定的、公用的數據庫鏈接,那麼咱們怎麼辦呢?咱們能夠把變化的東西抽出來做爲一個參數傳入JdbcTemplate的方法中。可是變化的東西是一段代碼,並且這段代碼會用到JdbcTemplate中的變量。怎麼辦?那咱們就用回調對象吧。在這個回調對象中定義一個操縱JdbcTemplate中變量的方法,咱們去實現這個方法,就把變化的東西集中到這裏了。而後咱們再傳入這個回調對象到JdbcTemplate,從而完成了調用。這多是Template Method不須要繼承的另外一種實現方式吧。
二者都是經過xml配置文件加載bean,ApplicationContext
和BeanFacotry
相比,提供了更多的擴展功能,但其主要區別在於後者是延遲加載,若是Bean的某一個屬性沒有注入,BeanFacotry
加載後,直至第一次使用調用getBean方法纔會拋出異常;而ApplicationContext則在初始化自身是檢驗,這樣有利於檢查所依賴屬性是否注入;因此一般狀況下咱們選擇使用ApplicationContext。
BeanFactroy
採用的是延遲加載形式來注入Bean的,即只有在使用到某個Bean
時(調用getBean()),纔對該Bean進行加載實例化,這樣,咱們就不能發現一些存在的Spring
的配置問題。而ApplicationContext
則相反,它是在容器啓動時,一次性建立了全部的Bean
。這樣,在容器啓動時,咱們就能夠發現Spring
中存在的配置錯誤。
BeanFactory
和ApplicationContext
都支持BeanPostProcessor
、BeanFactoryPostProcessor
的使用,但二者之間的區別是:BeanFactory
須要手動註冊,而ApplicationContext
則是自動註冊
IOC:
IOC就是控制反轉,通俗的說就是咱們不用本身建立實例對象,這些都交給Spring的bean工廠幫咱們建立管理。這也是Spring的核心思想,經過面向接口編程的方式來是實現對業務組件的動態依賴。這就意味着IOC是Spring針對解決程序耦合而存在的。在實際應用中,Spring經過配置文件(xml或者properties)指定須要實例化的java類(類名的完整字符串),包括這些java類的一組初始化值,經過加載讀取配置文件,用Spring提供的方法(getBean())就能夠獲取到咱們想要的根據指定配置進行初始化的實例對象。
DI:DI—Dependency Injection,即「依賴注入」:組件之間依賴關係由容器在運行期決定,形象的說,即由容器動態的將某個依賴關係注入到組件之中。依賴注入的目的並不是爲軟件系統帶來更多功能,而是爲了提高組件重用的頻率,併爲系統搭建一個靈活、可擴展的平臺。經過依賴注入機制,咱們只須要經過簡單的配置,而無需任何代碼就可指定目標須要的資源,完成自身的業務邏輯,而不須要關心具體的資源來自何處,由誰實現。
切入點(pointcut)和鏈接點(join point)匹配的概念是AOP的關鍵,這使得AOP不一樣於其它僅僅提供攔截功能的舊技術。 切入點使得定位通知(advice)可獨立於OO層次。 例如,一個提供聲明式事務管理的around通知能夠被應用到一組橫跨多個對象中的方法上(例如服務層的全部業務操做)。
概念
面向切面編程。AOP是OOP的延續,是軟件開發中的一個熱點,也是Spring框架中的一個重要內容,利用AOP能夠對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度下降,提升程序的可重用性,同時提升了開發的效率。
核心思想
能夠在不修改源代碼的前提下,對程序進行加強
實現原理
Spring框架的AOP技術底層也是採用的代理技術,所謂的動態代理就是說 AOP 框架不會去修改字節碼,而是在內存中臨時爲方法生成一個 AOP 對象,這個 AOP 對象包含了目標對象的所有方法,而且在特定的切點作了加強處理,並回調原對象的方法 。Spring AOP 中的動態代理主要有兩種方式, JDK
動態代理和 CGLIB
動態代理 。
JDK
動態代理:經過反射來接收被代理的類,而且要求被代理的類必須實現一個接口 。JDK 動態代理的核心是 InvocationHandler 接口和 Proxy 類 。CGLIB
動態代理: 若是目標類沒有實現接口,那麼 Spring AOP
會選擇使用 CGLIB
來動態代理目標類 。CGLIB
( Code Generation Library ),是一個代碼生成的類庫,能夠在運行時動態的生成某個類的子類,注意, CGLIB
是經過繼承的方式作的動態代理,所以若是某個類被標記爲 final
,那麼它是沒法使用 CGLIB
作動態代理的。支持以下五種不一樣的做用域
在Spring
中建立一個bean
的時候,咱們能夠聲明它的做用域。只須要在bean
定義的時候經過scope
屬性定義便可。例如,當Spring
須要產生每次一個新的bean
實例時,應該聲明bean
的scope
屬性爲prototype
。若是每次你但願Spring
返回一個實例,應該聲明bean
的scope
屬性爲singleton
。
有兩個重要的bean
生命週期方法。
setup
方法,該方法在容器加載bean
的時候被調用。teardown
方法,該方法在bean
從容器中移除的時候調用。bean標籤有兩個重要的屬性(init-method 和 destroy-method),你能夠經過這兩個屬性定義本身的初始化方法和析構方法。
Spring也有相應的註解:@PostConstruct
和 @PreDestroy
。
BeanNameAutoProxyCreator
DefaultAdvisorAutoProxyCreator
Metadata autoproxying
當一個bean僅被用做另外一個bean的屬性時,它能被聲明爲一個內部bean,爲了定義inner bean,在Spring 的 基於XML的 配置元數據中,能夠在 或 元素內使用 元素,內部bean一般是匿名的,它們的Scope通常是prototype。
說明:自動裝配沒有自定義裝配方式那麼精確,並且不能自動裝配簡單屬性(基本類型、字符串等),在使用時應注意。
徹底能夠。
Version | Feature |
---|---|
Spring 2.5 | 發佈於 2007 年。這是第一個支持註解的版本。 |
Spring 3 | 發佈於 2009 年。它徹底利用了 Java5 中的改進,併爲 JEE6 提供了支持。 |
Spring 4.0 | 發佈於 2013 年。這是第一個徹底支持 JAVA8 的版本。。 |
Spring DAO 使得 JDBC,Hibernate 或 JDO 這樣的數據訪問技術更容易以一種統一的方式工做。這使得用戶容易在持久性技術之間切換。它還容許您在編寫代碼時,無需考慮捕獲每種技術不一樣的異常。
spring-data-access-exception
Spring AOP
基於動態代理方式實現;AspectJ
基於靜態代理方式實現。Spring AOP
僅支持方法級別的 PointCut;提供了徹底的 AOP 支持,它還支持屬性級別的 PointCut。
大廠筆試內容集合(內有詳細解析) 持續更新中....
歡迎關注我的微信公衆號: Coder編程
歡迎關注 Coder編程公衆號,主要分享數據結構與算法、Java相關知識體系、框架知識及原理、Spring全家桶、微服務項目實戰、DevOps實踐之路、每日一篇互聯網大廠面試或筆試題以及PMP項目管理知識等。更多精彩內容正在路上~
新建了一個qq羣:315211365,歡迎你們進羣交流一塊兒學習。謝謝了!也能夠介紹給身邊有須要的朋友。文章收錄至
Github: https://github.com/CoderMerli...
Gitee: https://gitee.com/573059382/c...
歡迎關注並star~