講解Spring之前,我們首先梳理下Spring有哪些知識點可以進行入手原始碼分析,比如:
通過這些知識點,後續我們慢慢在深入Spring的使用及原理剖析,為了更好地理解Spring,我們需要先了解一個最簡單的範例——Hello World。在學習任何框架和語言之前,Hello World都是必不可少的。
//在以前大家都是spring.xml進行注入bean後供Spring框架解析
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
UserService userService = (UserService) context.getBean("userService");
userService.test();
spring.xml中的內容為:
<context:component-scan base-package="com.zhouyu"/>
<bean id="userService" class="com.zhouyu.service.UserService"/>
如果對上面的程式碼或者xml形式很陌生,再看下面一種程式碼,也是目前流行的一種形式
//通過我們的設定類進行注入bean並解析
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MySpringConfig.class);
//ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
UserService userService = (UserService) context.getBean("userService");
userService.test()
MySpringConfig中的內容為:
@ComponentScan("com.xiaoyu")
public class MySpringConfig {
@Bean
public UserService userService(){
return new UserService();
}
}
相信很多人都會對上面的程式碼不陌生,那我們來看下這三行程式碼都做了那些工作:
雖然我們目前很少直接使用這種方式來使用Spring,而是使用Spring MVC或者Spring Boot,但是它們都是基於上面這種方式的,都需要在內部去建立一個
ApplicationContext的,只不過:
下面我們將重點講解Spring對bean的建立,也就是大家常說的Bean的生命週期。雖然我們只是入門級別的學習,但我們仍將深入探討流程,但不會涉及到具體的原始碼分析。在後續的原始碼分析系列中,我們將著重分析每一個知識點。
那麼,Spring是如何建立一個Bean的呢?這就是Bean的生命週期。其大體過程如下:
通過以上步驟,我們可以瞭解到建立的物件可能存在兩種結果。如果不需要AOP,Bean就是通過構造方法建立的物件;如果需要AOP,Bean就是代理類所範例化得到的物件,而不是構造方法所得到的物件。
Bean建立後:
在Spring中,每個物件都會有預設的構造器。但是在實際業務中,有時候會存在多個構造器的情況。那麼,Spring如何去選擇使用哪個構造器去建立物件呢?
Spring的判斷邏輯如下:
Spring的設計思想是這樣的:
如果只有一個構造器,那麼沒有選擇,只能使用這個構造器
如果有多個,只選擇沒有入參的構造器,因為無參構造方法本身表示了一種預設的意義
還要一種就是使用了@Autowired註解修飾,那麼就表示人工干預 了Spring選擇的權利,直接選擇程式設計師指定的構造器,如果有參,裡面的引數bean物件(單例)會從單例快取池中取。
a.先按照bean型別進行查詢,如果只找到一個範例,那麼直接注入。
b.如果找到多個範例,那麼會進行匹配入參name名字來確定唯一一個範例。
c如果沒有找到,則會報錯,無法建立當前Bean物件
綜上所述,Spring會根據Bean的構造器情況進行選擇,如果需要人工干預,可以使用@Autowired註解修飾。
在建立物件時,Spring會判斷當前物件是否需要進行AOP代理。為了確定當前Bean物件是否需要代理,大致流程如下:
具體流程如下:
一談到事務,大家首先想到的肯定是@Transaction註解,而這種註解也會被Spring建立物件時檢測到,然後會生成代理物件,這種方式其實工作中用到的也特別多,用起來也特別爽,那我們也大概講下事務的邏輯處理吧,其大致流程如下:
以上是簡單的事務處理流程,深入細節會涉及到Spring的事務傳播級別,如果現在說的話,會陷入不必要的思考,自此我們的 [Spring入門系列] 也結篇了,在接下來的 [Spring原始碼系列] 中,我將更加詳細地講解這些內容。
「準備開車,可坐穩了別被摔下來」
先對這些流程有個印象,並帶著疑惑來進一步探究Spring的內部機制,好了,今天就講到這裡,我是小雨,我們下期再見。