1、定義與特色java
定義:一個分模塊的一站式後臺開發框架。spring
特徵:數據庫
(1)比起EJB,更輕量級別的容器框架,模塊形式組織,只須要調用相應模塊(jdbc、springmvc)編程
(2)Spring IOC低耦合容易組合對象之間的關係設計模式
(2)AOP更易對功能進行擴展,不須要將無關代碼寫進主業務中session
(3)Spring並非直接造輪子,而是利用已有技術,好比ORM(對象關係映射,將對象映射到數據庫)框架,logging框架;架構
二、 IOC/DImvc
控制反轉/依賴注入, bean自己不相互依賴,產生關係的活動進行不依賴於任何一方,整個依賴關係構建(注入)由第三方負責管理。框架
控制反轉其實現方法是依賴注入,甲方開放接口,在它須要的時候,可以讓乙方傳遞進來(注入)函數
傳統的方式是經過在程序中本身new對象A,再構建依賴對象B並注入到A中;
而Spring中建立和注入對象這過程交給了IOC容器處理,即動態的向某個對象提供他所須要的依賴對象,基礎技術是反射。
優勢1,沒必要要了解下層類代碼(歷史維護的底層代碼),直接在須要的時候注入。實際項目中,有的Service Class多是十年前寫的,有幾百個類做爲它的底層。假設咱們新寫的一個API須要實例化這個Service,就須要瞭解大量歷史代碼。IoC Container的這個特性就很完美的解決了這類問題——由於這個架構要求你在寫class的時候須要寫相應的Config文件,因此你要初始化好久之前的Service類的時候,前人都已經寫好了Config文件,你直接在須要用的地方注入這個Service就能夠了。這大大增長了項目的可維護性且下降了開發難度。
優勢2,資源由第三方控制,下降耦合度,同時方便資源的配置和管理。
三、 AOP
在運行時,動態地將代碼切入到類的指定方法、指定位置上的編程思想就是面向切面的編程。
(我的對於aop理解就是經過代理模式,將與主業務無關的代碼插入整個邏輯中,而不污染原有的功能結構)
四、 bean配置(bean註冊)
(1) 基於xml的bean配置(ApplicationContext)
使用被Spring命名空間的所支持的一系列的XML標籤來實現,如context、beans、jdbc、tx、aop、mvc等。
屬性<property name="name" value="tom"></property>
構造方法<constructor-arg value="Mike" name="name"></constructor-arg>
(2) 基於註解的bean配置
將bean描述轉移到組件類的內部,只須要在相關類上、方法上或者字段聲明上使用註解即。
@Component:泛指通用組件;用於對組件類進行標註
@Repository:用於對DAO組件類進行標註;
@Service:用於對Service組件類進行標註;
@Controller:用於對Controller組件類進行標註;
(3)基於java類的bean配置(經過代碼配置)
@Configuration所註解的類則表示這個類的主要目的是做爲bean定義的資源相似於<beans>;@Bean註解標註某個方法,告知這個方法返回一個對象,相似於<bean>。Ps:與A相比,由於是java代碼,能夠在編譯器檢查類型合法和id惟一。
下圖左上是基於java的bean聲明的基本語法方式,右上是如何進行bean之間的相互依賴聲明,下方是如何初始化和調用的過程。
|
五、 bean注入(bean使用,eg:類中包含一個類對象bean)
(1) 基於xml注入-屬性注入
屬性注入要求Bean提供一個默認的構造函數,併爲須要注入的屬性提供對應的SetXXX方法。Spring先調用Bean的默認構造函數實例化Bean對象,而後經過反射的方式調用Setter方法注入屬性值。
public class LogonService implements BeanNameAware{ private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } }
<bean id="userDao" class="com.baobaotao.anno.UserDao"/> <bean class="com.baobaotao.anno.LogonService"> <property name="userDao" ref="userDao"></property> </bean> |
(2) 基於xml注入-構造方法
使用構造函數注入的前提是Bean必須提供帶參數的構造函數。
public class LogonService implements BeanNameAware{ private UserDao userDao; public LogonService(){} public LogonService(LogDao logDao, UserDao userDao) { this.userDao = userDao; }}
<bean id="userDao" class="com.baobaotao.anno.UserDao"/> <bean class="com.baobaotao.anno.LogonService"> <constructor-arg ref="userDao"></constructor-arg> </bean> |
(3) 基於註解注入
@required註釋在某個設置方法上,避免由於bean太多致使忘記注入
@Autowired有更細粒度的裝配控制
@Qualifier(「userDao」)用於處理存在兩個相同類型的bean時,自動裝配產生歧義的問題
@Service public class LogonService implements BeanNameAware{ @Autowired(required=false) @Qualifier("userDao") private UserDao userDao;} |
六、 spring中bean的自動裝配
無須在Spring配置文件中描述JavaBean之間的依賴關係(如配置<property>、<constructor-arg>)。IOC容器會自動創建javabean之間的關聯關係。
(1) no-默認狀況下采用」ref」進行手動綁定;
(2) byname-根據名字進行裝配
(3) byType-根據某個bean所持有的依賴變量的數據類型進行自動裝配
(4) constructo-與byType相似,只不過是按照構造函數的參數類型進行對應bean匹配
(5) autodetect-自動使用constructor和byType進行自動裝配
七、 Spring做用域
結構:<bean id="userDao" class="com.ioc.UserDaoImpl" D="singleton"/>
singleton:單例模式,Spring IoC容器中只會存在一個共享的Bean實例,不管有多少個Bean引用它,始終指向同一對象。Singleton做用域是Spring中的缺省做用域,也能夠顯示的將Bean定義爲singleton模式,配置爲:
prototype:原型模式,每次經過Spring容器獲取prototype定義的bean時,容器都將建立一個新的Bean實例,每一個Bean實例都有本身的屬性和狀態,
request:在一次Http請求中,容器會返回該Bean的同一實例。而對不一樣的Http請求則會產生新的Bean,並且該bean僅在當前Http Request內有效,當前Http請求結束,該bean實例也將會被銷燬。
session:在一次Http Session中,容器會返回該Bean的同一實例。而對不一樣的Session請求則會建立新的實例,該bean實例僅在當前Session內有效。
global Session:在一個全局的Http Session中,容器會返回該Bean的同一個實例,僅在使用portlet context時有效。
八、 Spring中設計模式
單例模式-針對bean的singleton做用域
代理模式-AOP中體現的動態代理
工廠模式- BeanFactory用來建立對象的實例