bean 属性设置默认值_activiti7源码分析之引擎初始化与Bean注入
在之前的一篇文章中,介紹了Soringboot2與activiti7整合,本文我們看下整合后的activiti7是如何初始化的,以及相關(guān)Bean如何注入。
配置和創(chuàng)建工作流引擎
首先第一個(gè)問題,activiti7的初始化工作是怎么啟動(dòng)呢?我得從盤古開天辟地說(shuō)起,順便復(fù)習(xí)下Springboot相關(guān)知識(shí)。
Springboot的main函數(shù)上有個(gè)注解@SpringBootApplication,我們看下這個(gè)注解的的實(shí)現(xiàn),只看關(guān)鍵部分:
在這段代碼中有一個(gè)關(guān)鍵的注解@EnableAutoConfiguration,這個(gè)注解的作用是顧名思義的就是允許自動(dòng)配置,怎么實(shí)現(xiàn)呢,繼續(xù)看@EnableAutoConfiguration的源碼:
在這段代碼中,@Import({AutoConfigurationImportSelector.class})的作用是將AutoConfigurationImportSelector這個(gè)類注冊(cè)為Bean交給容器管理。這個(gè)類里面有個(gè)關(guān)鍵方法public String[] selectImports(AnnotationMetadata annotationMetadata)``,作用是掃描所有包(包含依賴jar包)中的``META-INF/spring.factories``文件,把其中key為"...EnableAutoConfiguration"對(duì)應(yīng)的value里的類都加載為Bean。
看下activiti-spring-boot-starter這個(gè)包中spring.factories文件的內(nèi)容:
所以,這個(gè)文件里面的三個(gè)類都被加載為Bean。即EndpointAutoConfiguration,ProcessEngineAutoConfiguration,ActivitiMethodSecurityAutoConfiguration這三個(gè)。這就是Springboot的自動(dòng)配置原理。總結(jié)起來(lái)就是@EnableAutoConfiguration會(huì)自動(dòng)掃描所有包下面的META-INF/spring.factories文件,將其中key以EnableAutoConfiguration結(jié)尾的對(duì)應(yīng)的value的類全部加載為Bean。這就是SPI機(jī)制,與JDK中的SPI和DUBBO的SPI類似,但是具體實(shí)現(xiàn)方法不一樣。關(guān)于SPI我之后會(huì)詳細(xì)講解。
我們關(guān)注ProcessEngineAutoConfiguration這個(gè)Bean,其余兩個(gè)以后再解釋。
看下ProcessEngineAutoConfiguration這個(gè)類部分的源碼:
這個(gè)類主要作用的就是流程引擎的配置,注解@EnableConfigurationProperties({ActivitiProperties.class, AsyncExecutorProperties.class})會(huì)將在properties中的配置屬性映射到對(duì)應(yīng)的類的屬性中去。例如常用的在application-dev.properties配置的database-schema-update,history-level,db-history-used等屬性就是在這里被映射到類ActivitiProperties中去的,然后在SpringProcessEngineConfiguration springProcessEngineConfiguration()方法中添加到引擎配置類中的。
ProcessEngineAutoConfiguration中會(huì)注冊(cè)很多Bean,其中有個(gè)比較重要:
SpringProcessEngineConfiguration這個(gè)Bean主要負(fù)責(zé)流程引擎的配置,將數(shù)據(jù)源和Springboot配置文件中配置的activiti7的相關(guān)屬性配置到引擎中去。這個(gè)Bean被注解@ConditionalOnMissingBean修飾,意思是只有在容器中不存在SpringProcessEngineConfiguration的情況下這個(gè)Bean才會(huì)被注冊(cè),因此如果要自定義自己的引擎配置,重新定義一個(gè)SpringProcessEngineConfiguration類型的Bean即可。
ProcessEngineAutoConfiguration繼承了AbstractProcessEngineAutoConfiguration,這個(gè)抽象類里面定義了幾個(gè)比較重要的Bean:
ProcessEngineFactoryBean這個(gè)Bean的主要作用產(chǎn)生ProcessEngine Bean,可以理解為是產(chǎn)生Bean的Bean,比較拗口。這個(gè)Bean實(shí)現(xiàn)了FactoryBean接口,FactoryBean接口是spring里面一個(gè)接口,與它長(zhǎng)得比較類似的事BeanFactory,它們作用完全不一樣。FactoryBean是一個(gè)工廠Bean,可以生成某一個(gè)類型Bean實(shí)例,它最大的一個(gè)作用是:可以讓我們自定義Bean的創(chuàng)建過(guò)程。BeanFactory是一個(gè)接口,它是Spring中工廠的頂層規(guī)范,是SpringIoc容器的核心接口,它定義了getBean()、containsBean()等管理Bean的通用方法。Spring的容器都是它的具體實(shí)現(xiàn),它負(fù)責(zé)管理所有的Bean,包括FactoryBean。
上面說(shuō)到FactoryBean可以讓我們自定義Bean的創(chuàng)建過(guò)程,那么怎么定義呢,方法很簡(jiǎn)單,只要實(shí)現(xiàn)FactoryBean的getObject方法即可。看下ProcessEngineFactoryBean中g(shù)etObject的實(shí)現(xiàn):
這里返回的類型也就是這個(gè)ProcessEngineFactoryBean產(chǎn)生的Bean即為Processengine。說(shuō)了這么多,可以簡(jiǎn)單概括為ProcessEngineFactoryBean主要是負(fù)責(zé)產(chǎn)生一個(gè)Processengine,實(shí)現(xiàn)引擎Bean的注入。
這個(gè)抽象類中還注入了其他常用的Bean,例如RuntimeService,RepositoryService,HistoryService,TaskService等。
與這個(gè)過(guò)程類似,在初始化的時(shí)候還加載了許多其他類型的Bean。
在ProcessEngineFactoryBean的getObject方法是為了創(chuàng)建Processengine,其中最關(guān)鍵的代碼:
this.processEngine = this.processEngineConfiguration.buildProcessEngine();跟進(jìn)去看這里的buildProcessEngine()的具體實(shí)現(xiàn):
其中的this.autoDeployResources(processEngine);會(huì)在項(xiàng)目啟動(dòng)的時(shí)候?qū)lasspath:*/processes/``目錄下的流程圖自動(dòng)部署。可以通過(guò)``spring.activiti.deployment-mode``這個(gè)屬性設(shè)置各種不同的部署策略。
這次先講到這里,下次介紹下activiti7的命令模式。
總結(jié)
以上是生活随笔為你收集整理的bean 属性设置默认值_activiti7源码分析之引擎初始化与Bean注入的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tomcat 项目发布失败原因_项目启动
- 下一篇: mysql select 使用_mysq