springboot 生成bean[Definition][Instance][proxy]入口
前提
如果你已經很瞭解spring framework中bean生成的原理和過程
,本文向你展示了一個精簡版和視覺化圖譜;如果你很想了解bean生成的過程,本文提供你梯子快速的走入bean生成的原理和實現細節。減少你花費的時間
名詞解析
- 入口:直接定位到一個功能實現的開始處,節省尋找定位花費的時間
知識點收穫
通過本文,你能收穫什麼?
- .class檔案生成beanDefinition的入口
1.0. 自己專案的.class生成beanDefinition的入口
1.1. @Configuration的.class生成beanDefinition的入口
1.2. @Bean的.class生成beanDefinition的入口
複製程式碼
- beanDefinition生成beanInstance的入口
- beanInstance生成proxy代理類的入口
- 如何直接debug指定bean的建立流程
》本文力求專注和精簡,希望你有所收穫和想法
我們都知道,spring framework
震架之寶之一:IOC,將bean的建立和銷燬交由spring容器,那麼bean在建立的路上都要經過哪些路途呢,又是怎麼放入spring容器的呢。我們順著下面的軸線開始
.class-->beanDefinition-->beanInstance-->proxy類
首先看一張圖,下圖展示了.class檔案生成beanDefinition 與 beanDefinition生成beanInstance 與 beanInstance生成proxy代理類的入口
示例
我們根據下面的程式碼片段舉例
我們自己定義一個簡單的Service介面和實現類
@Service
public class UserServiceImpl implements IUserService {
@Override
public int insert(User user) {}
}
spring mybatis定義的類
@Configuration
public class MapperAutoConfiguration {
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource)
}
}
複製程式碼
正文
開始看到spring容器中bean建立分成4個節點,三個階段
。如上軸線所示
bean在.class-->beanDefinition階段
如果bean是我們專案中定義的@Component
類,如示例UserServiceImpl
類。它的載入和生成beanDefinition要感謝@ComponentScan
這個註解,當然更要感謝真正發揮作用的ClassPathBeanDefinitionParser
類它的doScan(basePackages)
承擔了這個階段的功能實現。
bean在beanDefinition-->beanInstance階段
這個階段的功能實現一定要感謝AbstractAutowireCapableBeanFactory
,記住這個常常的名字,因為每個bean的例項化都是他的功勞。它的createBean(beanName,RootBeanDefinition,args)
方法如這個階段的入口。入口內做了三件事
- 生成beanInstance,即bean物件本尊
此功能由
createBeanInstance(beanName,args)
負責 - 向bean的beanDefinition賦屬性和值
此功能由
populateBean(beanName,BeanWrapper)
負責 - 如果滿足條件,beanInstance生成Proxy代理類
此功能由
AbstractAutoProxyCreator.postProcessAfterInitialization(Object bean,beanName)
,原理是應用BeanPostProcessor的post-processor模式
完成
bean在beanInstance-->proxy代理類
正如第二階段第三件事做的事情
it`s time to summary
到這裡,本文就說完了。篇幅很短,深度不深,細節不細。這正是本文的目的:剝離繁雜,直擊目標。通過本文,你能清晰的知道: spring容器建立bean
的道路上,有哪些關鍵節點,節點處發生了什麼,何時發生的。到這你會問,怎麼發生的你咋沒說啊。是的,這裡沒說,原因是它會篇幅很長,對你整體把握spring容器建立bean
不利。我想像剝洋蔥一樣一層一層深入,紮實清晰。
如果本文帶給你興趣了,那麼深入剝洋蔥這個事兒,你也可以開始了