1. 程式人生 > 程式設計 >springboot 生成bean[Definition][Instance][proxy]入口

springboot 生成bean[Definition][Instance][proxy]入口

前提

如果你已經很瞭解spring framework中bean生成的原理和過程,本文向你展示了一個精簡版和視覺化圖譜;如果你很想了解bean生成的過程,本文提供你梯子快速的走入bean生成的原理和實現細節。減少你花費的時間

名詞解析

  1. 入口:直接定位到一個功能實現的開始處,節省尋找定位花費的時間

知識點收穫

通過本文,你能收穫什麼?

  1. .class檔案生成beanDefinition的入口
  1.0. 自己專案的.class生成beanDefinition的入口
  1.1. @Configuration的.class生成beanDefinition的入口
  1.2. @Bean的.class生成beanDefinition的入口
複製程式碼
  1. beanDefinition生成beanInstance的入口
  2. beanInstance生成proxy代理類的入口
  3. 如何直接debug指定bean的建立流程

》本文力求專注和精簡,希望你有所收穫和想法

我們都知道,spring framework震架之寶之一:IOC,將bean的建立和銷燬交由spring容器,那麼bean在建立的路上都要經過哪些路途呢,又是怎麼放入spring容器的呢。我們順著下面的軸線開始

.class-->beanDefinition-->beanInstance-->proxy類

首先看一張圖,下圖展示了.class檔案生成beanDefinition 與 beanDefinition生成beanInstance 與 beanInstance生成proxy代理類的入口

,有了此圖,走原始碼時可以結合debug直接定位你要關注的細節。節省你和你尋找的知識點見面的時間

示例

我們根據下面的程式碼片段舉例

我們自己定義一個簡單的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)方法如這個階段的入口。入口內做了三件事

  1. 生成beanInstance,即bean物件本尊 此功能由createBeanInstance(beanName,args)負責
  2. 向bean的beanDefinition賦屬性和值 此功能由populateBean(beanName,BeanWrapper)負責
  3. 如果滿足條件,beanInstance生成Proxy代理類 此功能由AbstractAutoProxyCreator.postProcessAfterInitialization(Object bean,beanName),原理是應用BeanPostProcessor的post-processor模式完成

bean在beanInstance-->proxy代理類

正如第二階段第三件事做的事情

it`s time to summary

到這裡,本文就說完了。篇幅很短,深度不深,細節不細。這正是本文的目的:剝離繁雜,直擊目標。通過本文,你能清晰的知道: spring容器建立bean的道路上,有哪些關鍵節點,節點處發生了什麼,何時發生的。到這你會問,怎麼發生的你咋沒說啊。是的,這裡沒說,原因是它會篇幅很長,對你整體把握spring容器建立bean不利。我想像剝洋蔥一樣一層一層深入,紮實清晰。

如果本文帶給你興趣了,那麼深入剝洋蔥這個事兒,你也可以開始了