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