此文爲Spring Framework 5.1.5版本Core部分的用戶手冊的學習。對部份內容進行了翻譯摘取和學習理解,爲了方便本身的在使用中具體細節處的回顧,建議配合原用戶手冊一塊兒觀看。用戶手冊的地址爲html
https://docs.spring.io/spring/docs/5.1.5.RELEASE/spring-framework-reference/java
目 錄web
1 IOC容器... 3spring
1.1 簡介IOC容器和Beans. 3api
1.2 容器概覽... 3數組
1.2.1 配置信息... 3mvc
1.2.2 初始化一個容器... 3app
1.3 Bean概覽... 4框架
1.3.1 Bean命名... 5ide
1.3.2 實例化Bean. 5
1.4 依賴... 7
1.4.1 依賴注入... 7
1.4.2 依賴配置的一些補充... 9
1.4.3 使用depends-on屬性... 15
1.4.4 延遲初始化Bean. 15
1.4.5 Xml中Bean標籤中的自動裝配... 16
1.4.6 Method Injection 方法注入##. 17
1.5 Bean的做用域... 17
1.5.5 自定義Bean的做用域... 18
1.6 定製Bean的特性... 18
1.6.1 生命週期回調... 18
1.6.2 ApplicationContextAware and BeanNameAware. 19
1.6.3 其餘Aware. 20
1.7 Bean的繼承關係... 21
1.8 容器Container擴展的關鍵點... 21
1.8.1 BeanPostProcessor 21
1.8.2 BeanFactoryPostProcessor 21
1.8.3 FactoryBean. 21
1.9 基於註解的容器配置... 21
1.9.1 @Required. 22
1.9.2 @Autowired. 22
1.9.3 @Primary. 24
1.9.4 @Qualifier 24
1.9.5 能夠自動注入到泛型類中... 27
1.9.6 CustomAutowireConfigurer 27
1.9.7 使用@Resource實現注入... 27
1.9.8 @PostConstruct @PreDestroy. 27
1.10 路徑掃描和註解管理... 27
1.10.4 使用@ComponentScan過濾要掃描的註解... 27
1.10.6 對自動注入的Bean實現命名... 28
1.10.7 給自動注入的Bean實現提供做用域... 29
1.10.9 生成一個候選Component的座標... 30
1.11 使用JSR330標準的註解... 30
1.11.1 @Inject @Named. 31
1.11.2 @ManagedBean. 31
1.11.3 JSR330註解的一些限制... 31
1.12 經過Java代碼實現容器的配置... 32
1.12.2 AnnotationConfigApplicationContext 32
1.12.3 @Bean的一些相關... 33
1.12.5 Composing Java-based Configurations. 34
1.13 環境抽象... 35
1.13.1 Bean Definition Profiles. 35
1.13.2 PropertySource. 37
1.13.3 Using @PropertySource. 37
1.14 Registering a LoadTimeWeaver 37
1.15 ApplicationContext容器的一些額外功能... 38
1.16 BeanFactory. 38
2 Resources. 38
3 驗證、參數綁定、類型轉換... 39
3.1 驗證器... 39
3.3 BeanWrapper 39
3.3.1 settings and gettings. 39
3.3.2 PropertyEditor 40
3.4 Spring Type Conversion. 41
3.4.1 Converter接口... 41
3.4.2 ConverterFactory. 42
3.4.3 GenericConverter 42
3.4.4-3.46 ConversionService. 42
3.5 Spring Field Formatting. 43
3.5.1 Formatter格式器... 43
3.5.2 Annotation-driven Formatting. 43
3.5.3 FormatterRegistry格式器註冊... 45
3.5.4 FormatterRegistrar格式器註冊... 45
3.6 Configuring a Global Date and Time Format 45
3.7 Spring Validation. 46
3.7.1 JSR-303 Bean Validation API. 46
3.7.2 Configuring a Bean Validation Provider 46
3.7.3 Configuring a DataBinder 48
4 Spring Expression Language (SpEL) 48
5 AOP. 49
5.4 @AspectJ support 49
5.4.1. Enabling @AspectJ Support 49
5.4.2. Declaring an Aspect聲明切面... 49
5.4.3. Declaring a Pointcut 聲明切點... 50
5.4.4. Declaring Advice聲明通知... 52
5.4.5 Introductions-@DeclareParents. 52
單機模式最多見的ClassPathXmlApplicationContext
or FileSystemXmlApplicationContext
除了xml以外,還有兩種方式,第一種是在xml文件裏添加<context:annotation-config/>,開啓自動配置;第二種是經過一些註解。
能夠一次讀取多個xml。
還能夠在xml文件的beans標籤內經過import引入其餘xml文件。
Bean在容器中存儲是以BeanDefinition的形式存在的。
下邊的是Bean的一些屬性
而後還能夠調用getBeanFactory方法以後得到一個BeanFactory對象,而後再註冊不在容器中的Bean。
Bean裏邊的id屬性和name屬性是不一樣的。
Id傳惟一id,name能夠傳別名,可用經過逗號和分號分隔好多別名
Xml裏邊還能夠傳入alias標籤,提供額外的別名。這樣就能夠經過後邊的別名訪問Bean
經過class指定要生成什麼類,還能夠經過如下兩種方法生成,後邊會有。
若是想要一個內部類的話,那麼要使用二進制方法。下邊加了個$號
經過靜態工廠方法實例化Bean
這個例子不太好,其實應該是一個工廠類裏邊生成一個實例,ServiceFactory裏邊生成一個service比較好。注意,這個裏邊的class並非返回對象的類型,這個xml中甚至都沒有返回的類型。
經過實例工廠實例化Bean,工廠須要實例,因此先建立一個工廠,而後Bean再跟工廠創建聯繫。固然一個工廠裏邊能夠產出好多不一樣的對象,這裏就不在截圖了。
經過構造器方法實現依賴注入,下邊那種index起始值是0.
註解@ConstructorProperties能夠標註在構造器方法上
選擇構造器注入仍是setter注入呢?強制的參數用構造器,可選的參數用setter。
依賴解析的過程
使用構造器注入可能會有循環依賴的問題。那麼就改造下,用setter注入吧。
靜態工廠中也能夠經過構造器注入的方式生成Bean,看下邊的。
可使用namespace。
能夠在Bean中按下邊的方式傳入Properties對象。
可使用idref標籤防錯,防止出現下邊的狀況,把引用類型和值類型搞錯了。並保證引用的值必定存在。
在ref中使用parent屬性能夠指定父容器中的值。
Inner Beans
Collections,參數中涉及集合類型
Collection Merging
空值和null值,若是是字符串類型的話,在xml裏邊「」表明空字符串,要用null標籤代表是null值。
XML Shortcut with the p-namespace
這裏大概講了下命名空間的使用。
XML Shortcut with the c-namespace
複合屬性名稱,以下邊的fred屬性有bob屬性,bob屬性有sammy屬性,最終給sammy賦值,要保證路徑上的屬性都不爲空。
Bean之間有依賴關係,就是讓一些要被注入到別的Bean的Bean,做爲屬性的Bean要提早完成實例化。
若是Bean被設置爲延遲初始化的話,可是另外一個非延遲的Bean依賴了它,那麼他仍是會在容器建好的時候被初始化。
這裏講的是在xml中也能夠對於當個Bean設置自動配置,好比一個A Bean依賴B Bean,那麼B Bean配置好以後 ,在A Bean裏邊能夠不用ref指定BBean,在A的標籤中經過添加autowire屬性來設置自動裝配,根據不一樣的裝配規則,會把B自動注入到A中。
可是自動裝配有一些缺點和限制。不精確,容易有歧義,不能裝配基礎類型,而後會被精確地依賴注入所覆蓋。
將一個Bean排除在自動裝配以外,能夠對Bean標籤中設置autowire-candidate屬性爲false。
default-autowire-candidates標籤能夠指定自動裝配哪些Bean,在Beans標籤中設置,經過模式匹配。好比有A依賴B,咱們將autowire屬性設置爲byType,在xml中2個B,這樣在idea裏邊xml會被紅波浪線警告,由於A沒法判斷應該加載哪一個,咱們在最頂層的Beans標籤中經過模式匹配的方式將default-autowire-candidates的值設置爲能匹配上某一個標籤,那麼最後所對應的B Bean就會被注入到A中。
看官方文檔沒看懂,網上搜了下,這個就是能夠將抽象方法經過方法注入的方式變得可使用。見下邊的兩個網址好了。Look-up method 和replace-method。還有@Lookup註解。
http://www.javashuo.com/article/p-crqinxfm-co.html
https://www.cnblogs.com/atwanli/articles/6154920.html
這裏關於web那塊的說明能夠到時候結合用戶手冊再看看。
關於把一個短生命週期的Bean注入到一個長聲明週期的Bean中,能夠在Bean中添加<aop:scoped-proxy/>。緣由能夠見下邊的博文。
https://blog.csdn.net/soonfly/article/details/69360680
這裏就是定義容器Container和Bean在整個生命週期裏邊幹什麼,經過實現不一樣的接口來實現每個環節的處理。
這裏先是將能夠在Bean中的屬性設置init-method 和destroy-method標籤,沒什麼好主意的。有一點,能夠在Beans屬性中配置default-init-method,來自動識別每一個Bean裏邊的init,這樣省去了每一個Bean中都單獨設置init的麻煩。default-destroy-method同理。
這裏講了目前能夠經過三種方式控制Bean的生成和摧毀,他們有着這樣的順序。
ApplicationContextAware接口實現後能夠在建立Bean的同時,讓Bean得到容器的控制權。
BeanNameAware的做用是讓Bean直到本身再容器中的名字。
在xml文件中能夠經過以下方式開啓註解掃描。
該註解用在setter方法上,是要求該屬性在配置Bean的信息時必須被注入。
在JSR 330規範中可使用@Inject代替本註解
該註解能夠在構造器方法、setter方法、屬性上。
還能夠把一樣的不少Bean放到數組裏或者其餘集合裏。
甚至在Map容器能夠。
可使用@Order和@Priority來控制容器中Bean的順序
默認狀況下自動注入若是沒有能夠注入的話會報錯,因此咱們能夠用@Autowired(required = false)實現非強制性的注入,這樣沒有Bean就不會報錯了。
採用Java8提供的Optional特性和Spring5中提供的@Nullable註解(可爲空)來表達依賴注入的非必要性。
@Autowired註解還能夠標註在Spring的容器屬性上。
同一種類型的Bean,標註了這個那麼優先用。
該註解可讓自動裝配的註解有必定優先級,或者作相關的模式匹配。
而後生成Bean的時候能夠指定qualifier的value。
@Qualifier註解還能夠被開發者組合或繼承實現新的註解。
能夠標註在屬性或setter方法上。
@Resource和@PostConstruct @PreDestroy自己屬於java的,但在高版本jdk中就不是了,因此使用要注意。
@Component @Service @Controller @Repository @SessionScope
下邊的例子是能夠在那些註解裏邊添加名稱,若是沒有添加名稱的話那麼就是類首字母小寫形式的命名。
能夠實現BeanNameGenerator接口來實現自動裝配Bean的命名規則
@Scope註解能夠代表Bean的做用域
能夠經過實現ScopeMetadataResolver接口實現@Scope配置的解析生成一個ScopeMetadata對象。
還有底下的,同1.5.4節講的內容
雖然類路徑掃描速度很是快,但能夠經過在編譯時建立候選的靜態列表來提升大型應用程序的啓動性能。在此模式下,全部做爲組件掃描目標的模塊都必須使用此機制。
須要導入額外的模塊。
經過一個註解配置類傳入applicationcontext中,還能夠把標註Configuration的類也穿進去。
@Bean能夠傳入別名,也能夠添加@Description描述
使用@Import註解能夠導入別的配置類
@Configuration註解能夠配合@ImportResource註解使用。
使用@Profile註解代表環境
而後能夠組合註解
而後經過xml的方式實現上邊不一樣環境同樣的效果
激活一種環境Activating a Profile。
@EnableLoadTimeWeaving
嗯。。講了一些怎麼用ctx讀取資源,沒什麼以爲特別重要的。
Spring提供了一個Validator接口。
它提供了兩個方法,supports方法用於驗證是否是對應的類,validate方法用於提供驗證邏輯,而且能夠把錯誤交給Error處理。
這裏還提供了一個ValidationUtils類幫助咱們作不少的驗證處理。
The way the BeanWrapper works is partly indicated by its name: it wraps a bean to perform actions on that bean, such as setting and retrieving properties.
原文中說BeanWrapper的做用如其名,包裹一個javaBean而後在其上實施操做。
下邊是一個其的用例,使用它完成綁定。
Spring提供了不少能見類和string進行對應轉換的PropertyEditor類。
舉了兩個例子:
ClassEditor:在spring中幫助咱們將xml中的string找到對應的class。
還有在springmvc中不少的PropertyEditor將http請求轉換成mvc中對應的類。
Spring中經過java.beans.PropertyEditorManager能夠實現必定程度的自動註冊,可是具體的類名和文件結構要按照下邊的格式。
這一章節還講了幾種實現Editor和其註冊的方法。
實現類型轉換
ConditionalGenericConverter接口用來實現條件converter
ConversionService的相關實現類能夠起到必定的註冊converter的做用。
對於要轉換一些複雜類型,好比list中是Integer的到list中是String的,經過使用TypeDescriptor。
AnnotationFormatterFactory經過實現這個類去實現和Formatter進行相關綁定。
能夠學習AnnotationFormatterFactory類,學習他如何與@NumberFormat這個註解進行綁定的。
LocalValidatorFactoryBean使用這個類,選擇某一種規格的Validator。
這裏的意思應該是指定不一樣的Validator。
要實現Validation,要兩步:一、@Constraint包含的註解。二、javax.validation.ConstraintValidator實現這個類
這一章節就是講SpEL的,大概內容就是好比xml或者註解中那些用#{}表示的內容。
關鍵的類就是ExpressionParser及其衍生類
經過兩種開始開啓aop。
做爲切點的方法必須是void類型的
切點裏邊聲明的關鍵字有如下這些。
這裏有幾個簡單的切點的例子。
這一小節有不少的例子,能夠看看如何使用。
這裏主要講了@DeclareParents這個註解,能在不改動原類代碼的狀況下額外添加方法,實際上是經過實現另外一個接口來實現的。
這裏最重要的就是用mvn導入spring-aop的時候,它包含的aspectj是不全的,要使用@DeclareParents類,須要aspectj框架的jrt,tools和weaver,aop只包含了最後一個。不少教材都沒說這一點,在網上看了看估計是spring版本的問題,老的版本估計aop把包都包含了,反正在如今5.1.5的版本要本身額外引入。
能夠指定切面的實例化方式,perthis和pertarget
選擇spring-aop仍是aspectj的問題。
選擇xml風格仍是@Aspect註解實現aop的問題。
這裏介紹了什麼時候使用jdk動態代理和cglib。能夠經過以下設置強制設置使用cglib
大概講了一堆,看了一下貌似是說自調用是不會觸發aop的。(就是好比要切的類含有兩個方法,一個方法裏邊調用了另外一個,這樣是不會觸發aop的)。
能夠看到下邊的是使用AspectJProxyFactory工廠,傳入目標類、(多個)切面,最終獲取到代理對象後在執行。
在本節中,咱們將介紹如何使用AspectJ編譯器或weaver代替Spring AOP或者除了Spring AOP以外,若是您的需求超出了Spring AOP提供的功能。
@Configurable註解,這章主要講的。
沒什麼用這章。
前一章描述了Spring使用@AspectJ和基於模式的方面定義對AOP的支持。在本章中,咱們將討論較低級別的Spring AOP API以及Spring 1.2應用程序中經常使用的AOP支持。對於新應用程序,咱們建議使用前一章中描述的Spring 2.0及更高版本的AOP支持。可是,當您使用現有應用程序時(或者當您閱讀書籍和文章時),您可能會遇到Spring 1.2風格的示例。 Spring 5仍然向後兼容Spring 1.2,本章中描述的全部內容在Spring 5中都獲得了徹底支持。
這章就是講了spring的xml文件應該怎麼搞。
@EnableLoadTimeWeaving 註解或<context:load-time-weaver/>配置
講了織入能夠分爲:編譯器、類加載期、運行期(動態代理和cglib屬於這個)
Ltw屬於類加載期。
第二個url的例子本身跑了一遍,也結合第一個url的例子的說明,ltw能夠起到這麼一個做用:
同一份代碼、同一份配置,只須要在VM啓動參數中稍加變化,便可實現同一個應用包在不一樣環境下能夠自由選擇使用使用AOP功能。https://sexycoding.iteye.com/blog/1062372
http://www.javashuo.com/article/p-edorvjyy-cd.html