Spring是什麼java
是一個開源框架,爲了解決企業應用開發的複雜性而建立的,web
是一個輕量級的控制反轉和麪向切面的容器框架spring
Spring Framework Runtimeexpress
Spring做用編程
容器數組
提供了對多種技術的支持安全
JMS、MQ、UnitTestsession
AOP(事務管理、日誌等)app
提供了衆多方便應用的輔助類框架
對主流框架提供良好的支持
什麼是框架
一般指的是爲了實現某個業界標準或完成特定基本任務的軟件組件規範,也指爲了實現某個軟件組件規範時,提供規範所要求之基礎功能的軟件產品
框架的特色
半成品、封裝了特定的處理流程和控制邏輯、成熟
框架與類庫的區別
框架通常是封裝了邏輯、高內聚的,類庫則是鬆散的工具組合
框架專一於某一領域,類庫則是更通用
IOC
接口及面向接口編程
接口
一、用於溝通的中介物的抽象化
二、實體把本身提供給外界的一種抽象化說明,用以由內部操做分離出外部溝通方法,使其能被修改而不影響外界其餘實體與其交互方式
三、對應Java接口即聲明,聲明瞭哪些方法是對外公開提供的
四、在Java8中,接口能夠擁有方法體
面向接口編程
一、結構設計中,分清層次及調用關係,每層只向外(上層)提供一組功能接口,各層間僅依賴接口而非實現類
二、接口實現的變更不影響各層間的調用,這一點在公共服務中尤其重要
三、「面向接口編程」中的「接口」是用於隱藏具體實現和實現多態的組件
什麼是IOC
IOC:控制反轉,控制權的轉移,應用程序自己並不負責依賴對象的建立和維護,而是由外部容器負責建立和維護
DI是其一種實現方式
目的:建立對象而且組裝對象之間的關係
Spring的bean配置
xml、註解
Bean容器初始化
基礎:兩個bao
org.springframework.beans
org.springframework.context
BeanFactory提供配置結構和基本功能,加載並初始化Beam
ApplicationContext保存了Bean對象並在Spring中被普遍使用
方式:ApplicationContext
本地文件
Classpath
Web應用中依賴servlet或Listener
Spring注入
是指在啓動Spring容器加載bean配置的時候,完成對變量的賦值行爲
經常使用的兩種注入方式
設置注入
構造注入
Spring bean裝配之Bean的配置項及做用域
bean的配置項
id:惟一標示
class:實例化類
scope:做用域
Constructor arguments:構造器參數
properties:屬性
Autowiring mode:自動裝配模式
lazy-intialization mode:懶加載模式
Initialization/destruction method:初始化和銷燬
bean的做用域
singletion(默認模式):單例,指在一個bean容器中只存在一個
prototype:每次請求建立新的實例,destroy方式不生效
request:每次htto請求建立一個實例且僅在當前request有效
session:與request類似,在當前session內有效
global session:基於portlet的web中有效
bean的生命週期
定義:經過xml,annotation
初始化:
實現org.springframework.beans.factory.InitializingBean接口,實現afterPropertiesSet方法
配置init-method
銷燬
實現org.springframework.beans.factory.DisposableBean接口,覆蓋destroy方法
配置destroy-method
配置全局默認初始化、銷燬方法
注當三種方式同時使用時,默認的配置不生效,實現接口優先於配置
Aware
Spring中提供了一些以Aware結尾的接口實現了Aware接口的bean在被初始化以後,能夠獲取相應資源
經過Aware接口,能夠對Spring相應資源進行造做
爲對Spring進行簡單的擴展提供了方便的入口
bean的自動裝配
No:不作任何操做
byname:根據屬性名自動裝配,此選項將檢查容器並根據名字查找與屬性徹底一致的bean,並將其與屬性自動裝配
bytype:若是容器中存在一個與指定屬性類型相同的bean,那麼將於該屬性自動裝配,若是存在多個該類型bean,那麼拋出異常,並指出不能使用byType方式進行自動裝配,若是沒有找到相匹配的bean,則什麼事都不發生
Constructor:與byType方式相似,不一樣之處在於它應用於構造參數,若是容器中沒有找到與構造參數類型一致的bean,那麼拋出異常
Resources&
針對資源文件的統一接口
Resources
UrlResources:URL對應的資源,根據一個URL地址便可構建
ClassPathResources:獲取類路徑下的資源文件
FileSystemResources:獲取文件系統裏面的資源
ServlrtContextResources:ServletContext封裝的資源,用於訪問ServletContext環境下的資源
InputStreamResource:針對輸入流封裝的資源
ByteArrayResource:針對於字節數組封裝的資源
ResourceLoader
對Resources加載,全部的ApplicationConeext都實現了Resources
bean的定義及做用域的註解實現
Classpath掃描與組件管理
類的自動檢測與註冊Bean
Spring能夠自動檢測類並註冊Bean到ApplicationContext
<context:annotation-config/>
<context:component-sca base-packge="" />包含<context:annotation-config/>功能
<context:include-filter type="" expression=""/>
<context:exclude-filter type="" expression=""/>
可使用use-default-filters = 「false」禁用自動發現與註冊
type有:annotation、assignable、aspectj、regex、custom
定義一個bean
掃描過程當中組件被自動檢測,那麼Bean名稱是由BeanNameGenerator生成的(@Component、@Respository、@Service、@Controller都會有name屬性用於顯示設置Bean Name)
@Scop 指定做用域,也能夠自定義scop策略
@Component
@Respository
@Service
@Controller
@Required:
適用於setter方法
這個註解僅僅表示,受影響的bean屬性必須在配置時被填充,經過在bean定義或經過自動裝配一個明確的屬性值
@Autowired
能夠用於setter方法
能夠用於構造器或成員變量
每一個類只能有一個構造器被標記爲required=true
@Qualifier
按類型自動裝配可能多個bean實例的狀況,可使用此註解縮小範圍(或指定惟一),也能夠用指定單獨的構造器參數或方法參數
可用於註解集合類型變量
@Resource:至關於 @Autowired + @Resource ,適用於成員變量、只有一個參數的setter方法
基於java容器的註解
@Bean標識一個用於配置和初始化一個由SpringIoC容器管理的新對象的方法,相似於XML配置文件的<bean>,默認是單例的
@Configration:標記爲一個配置類
@ImportResource:引入資源文件
@Value:讀取配置文件中的值
基於泛型的自動裝配
Spring對JSR支持的說明
@Resource
@PostConstruct:初始化回調
@PreDestroy:銷燬回調
注:只有CommonAnnotationBeanPostProcessor是Spring的ApplicationContext中註冊的
JSR330標準註解
須要依賴javax.inject包
@Inject:等效與@Autowired
@Named若是想使用特定名稱進行依賴注入,與Component等效
AOP
意爲面向切面編程,經過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術
主要的功能:日誌記錄,性能統計,安全控制,事務處理,異常處理等
切面:橫切與各個功能之上的
實現方式
預編譯:AspectJ
運行期動態代理(JDK、CGLIB):SpringAOP、JbossAOP
相關概念
Advice的類型
Spring框架中AOP的用途
提供了聲明式的企業服務,特別是EJB的替代服務的聲明
容許用戶定製本身的方面,以完成OOP與AOP的互補使用
Spring的AOP實現
純java實現,無需特殊的編譯過程,不須要控制類加載器層次
目前只支持方法執行鏈接點
不是爲了提供最完整的AOP,而是側重於一種AOP實現和Spring IoC容器之間的整合,用於幫助解決企業應用中的常見問題
Spring AOP不會與AspectJ競爭,從而提供全面的AOP解決方案
有接口和無接口的SpringAOP實現區別
Spring AOP默認使用標準的JavaSE動態代理做爲AOP代理,這使得任何接口均可以被代理
Spring AOP中也可使用CGLIB代理
Schema-based AOP
Spring全部的切面和通知都必須放在<aop:config>內(能夠配置包含多個<aop:config>元素),每一個<aop:config>能夠包含pointcut、dvisor和aspect
注:必須按照這個順序進行聲明
<aop:config>大量使用了Spring代理的機制
pointcut
execution(public * *(..)) 切入點爲執行全部public方法時
execution(* set*(..)) 切入點爲執行全部set開始的方法時
execution(* com.**.*.*(..)) 切入點爲某個類中的全部方法時
execution(* com..(..)) 切入點爲執行某個包下的全部方法時
exection(* com...(..)) 切入點爲執行某個包及其子包下的全部方法時
within(com.*)(only in Spring AOP)
within(com..*)(only in Spring AOP)
within用於匹配指定類型內的方法執行
this(com.fg.TestServer)(only in Spring AOP)this用於匹配當前AOP代理對象類型的執行方法
advice
Before advice
After returning advice
After throwing advice
使用throwing屬性來指定可被傳遞的異常的參數名稱
After(finally)advice
Around advice:通知方法的第一個參數必須是ProceedingJoinPoint類型
Advice parameters
Introductions
簡介容許一個切面聲明一個實現指定接口的通知對象,而且提供了一個接口實現類來表明這些對象
由<aop:aspect>中的<aop:declare-parents>元素聲明該元素用於聲明所匹配的類型擁有一個新的parent
advisors
就像一個小的自包含的方面,只有一個advice
切面自身經過一個bean表示,而且必須實現某個advice接口,同時,advisor也能夠很好的利用AspectJ的切入點表達式
大多數會與transaction adcice配合使用
可使用order屬性定義順序
Spring AOP API
Pointcut
實現之一:NameMatchMethodPintcut,根據方法名進行匹配
成員變量:mappedNames,匹配的方法名集合
ProxyFactoryBean