spring是一個企業級應用的開源開發框架,主要用來開發java應用,spring框架目標就是簡化企業級應用開發。java
spring裏面用到了大量的設計模式,這裏舉例比較有表明性的:web
代理模式:在aop中使用比較多 單例模式:在spring配置文件定義的bean默認爲單例模式 模板模式:用來解決代碼重複問題 工廠模式:BeanFactory用來建立對象的實例。spring
1.輕量:spring是輕量的,基本版本大約2MB 2.控制反轉;spring經過這個實現了鬆散耦合,對象給他們依賴,而不是建立對象 3.spring支持面向切面的編程,而且把業務邏輯和系統服務分開 4.spring容器包含管理應用中對象的聲生命週期和配置編程
spring IOC 負責建立對象,管理對象(經過依賴注入),裝配對象,配置對象,並管理對象的生命週期設計模式
IOC 或 依賴注入把應用的代碼量降到最低。它使應用容易測試,最小的代價和最小的侵入性使鬆散耦合得以實現安全
ClassPathXmlApplicationContext:此容器從一個xml文件中加載beans的定義。xml bean 配置文件的全路徑名必須提供給他的構造函數。 WebXmlApplicationContext:此容器加載一個xml文件,此文件定義了一個WEB應用的全部bean。網絡
基於xml的配置 基於註解的配置 基於java的配置session
依賴注入是ioc的一個方面,是指不須要你建立對象,只須要描述對象如何建立,你不在代碼裏直接組裝你的組件和服務,可是要在配置文件裏描述哪些組件須要哪些服務,以後一個容器(IOC容器)負責把他們組裝起來。併發
構造器依賴注入:構造器依賴注入經過容器觸發一個類的構造器來實現的 setting:Setter方法注入是容器經過調用無參構造器或無參static工廠 方法實例化bean以後,調用該bean的setter方法,即實現了基於setter的依賴注入。框架
構造器參數實現強制依賴,setter方法實現可選依賴
singleton:這是默認的,單例模式,無論有多少個請求,每一個容器只有一個bean實例化 prototype:它和單例相反爲每個請求提供一個實例,原型模式 request:在每個客服端的網絡請求建立一個實例,在請求完成後,bean失效並垃圾回收器回收 session:確保每個session中有一個bean實例,在session過時後,bean會隨之失效 global-session:在一個全局的HTTP Session中,一個bean定義對應一個實例。該做用域僅在基於web的Spring ApplicationContext情形下有效。
確定不是線程安全的,當多用戶同時請求一個服務時,容器會給每個請求分配一個線程,這是多個線程會併發執行該請求多對應的業務邏輯(成員方法),此時就要注意了,若是該處理邏輯中有對該單列狀態的修改(體現爲該單列的成員屬性),則必須考慮線程同步問題.
spring容器可以自動裝配相互合做的bean,這意味着容器不須要<constructor-arg>和<property>配置,能經過Bean工廠自動處理bean之間的協做。
重寫: 你仍需用 <constructor-arg>和 <property> 配置來定義依賴,意味着總要重寫自動裝配。 基本數據類型:你不能自動裝配簡單的屬性,如基本數據類型,String字符串,和類。
@Configuration註解,表示該類是一個配置類,用來定義bean資源 @bean:由@Bean註解的方法將會實例化、配置和初始化一個新對象,這個對象將由Spring的IoC容器來管理 ,@Bean聲明所起到的做用與<bean/> 元素相似
註解裝配默認是不開啓的,使用必須在配置文件配置context:annotation-config/元素。
這個註解代表bean的屬性必須在配置的時候設置,經過一個bean定義的顯示的屬性值或經過自動裝配,若@Required註解的bean屬性未被設置,容器將拋BeanInitializationException
;經過類型來實現自動注入bean。和@Qualifier註解配合使用能夠實現根據name注入bean
@Autowired一塊使用,在同一類型的bean有多個的狀況下能夠實現根據name注入的需求
默認是根據name注入bean的,能夠經過設置類型來實現經過類型來注入
spring支持兩種類型的事務管理: 編程式事務管理:經過編程的方式管理事務,可是極難維護 聲明式事務管理:能夠將業務代碼和事務管理分離,只須要註解和xml配置來管理事務。
大多數Spring框架的用戶選擇聲明式事務管理,由於它對應用代碼的影響最小,所以更符合一個無侵入的輕量級容器的思想。聲明式事務管理要優於編程式事務管理,雖然比編程式事務管理(這種方式容許你經過代碼控制事務)少了一點靈活性。
面向切面編程,是一種編程技術,容許程序模塊化橫向切割關注點,如日誌和事務管理
關注點是一個模塊的行爲,一個關注點可能會被定義爲咱們想要實現的功能,橫切關注點是貫穿整個應用程序的關注點,並影響整個應用,好比日誌,數據傳輸
通知是個在方法執行前或執行後要作的動做,其實是程序執行時要經過SpringAOP框架觸發的代碼段。
spring切面能夠應用五種類型的通知: before:前置通知,在一個方法執行前調用 after:在方法執行後調用的通知,不管方法是否執行成功 after-returning:僅當方法執行完成後執行的通知 after-throwing:在方法拋出異常退出時執行的通知 around在方法執行以前和執行以後都會執行的通知
代理是使用很是普遍的設計模式,代理是通知目標對象建立後的對象。
鏈接點是程序執行的一個點,例如,一個方法的執行或者一個異常的處理,一個鏈接點老是表明一個方法執行。舉例來講,全部定義在你的 EmpoyeeManager 接口中的方法均可以被認爲是一個鏈接點,若是你在這些方法上使用橫切關注點的話。
切入點是一個匹配鏈接點的斷言或者表達式。Advice 與切入點表達式相關聯,並在切入點匹配的任何鏈接點處運行(好比,表達式 execution(* EmployeeManager.getEmployeeById(...)) 能夠匹配 EmployeeManager 接口的 getEmployeeById() )
織入是將切面和其餘應用類型或對象鏈接或建立一個通知對象的過程。 織入能夠在編譯時,加載時或運行時完成。