Spring是什么
是一個開源框架,為了解決企業應用開發的復雜性而創建的,
是一個輕量級的控制反轉和面向切面的容器框架
Spring Framework Runtime
Spring作用
容器
提供了對多種技術的支持
JMS、MQ、UnitTest
AOP(事務管理、日志等)
提供了眾多方便應用的輔助類
對主流框架提供良好的支持
什么是框架
通常指的是為了實現某個業界標准或完成特定基本任務的軟件組件規范,也指為了實現某個軟件組件規范時,提供規范所要求之基礎功能的軟件產品
框架的特點
半成品、封裝了特定的處理流程和控制邏輯、成熟
框架與類庫的區別
框架一般是封裝了邏輯、高內聚的,類庫則是松散的工具組合
框架專注於某一領域,類庫則是更通用
IOC
接口及面向接口編程
接口
1、用於溝通的中介物的抽象化
2、實體把自己提供給外界的一種抽象化說明,用以由內部操作分離出外部溝通方法,使其能被修改而不影響外界其他實體與其交互方式
3、對應Java接口即聲明,聲明了哪些方法是對外公開提供的
4、在Java8中,接口可以擁有方法體
面向接口編程
1、結構設計中,分清層次及調用關系,每層只向外(上層)提供一組功能接口,各層間僅依賴接口而非實現類
2、接口實現的變動不影響各層間的調用,這一點在公共服務中尤為重要
3、“面向接口編程”中的“接口”是用於隱藏具體實現和實現多態的組件
什么是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