本篇文章給大家分享的是有關(guān)怎樣進(jìn)行Spring boot 啟動層面的開發(fā),小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
創(chuàng)新互聯(lián)建站是一家網(wǎng)站設(shè)計公司,集創(chuàng)意、互聯(lián)網(wǎng)應(yīng)用、軟件技術(shù)為一體的創(chuàng)意網(wǎng)站建設(shè)服務(wù)商,主營產(chǎn)品:響應(yīng)式網(wǎng)站建設(shè)、高端網(wǎng)站設(shè)計、成都營銷網(wǎng)站建設(shè)。我們專注企業(yè)品牌在網(wǎng)站中的整體樹立,網(wǎng)絡(luò)互動的體驗,以及在手機等移動端的優(yōu)質(zhì)呈現(xiàn)。網(wǎng)站建設(shè)、成都做網(wǎng)站、移動互聯(lián)產(chǎn)品、網(wǎng)絡(luò)運營、VI設(shè)計、云產(chǎn)品.運維為核心業(yè)務(wù)。為用戶提供一站式解決方案,我們深知市場的競爭激烈,認(rèn)真對待每位客戶,為客戶提供賞析悅目的作品,網(wǎng)站的價值服務(wù)。
Spring boot的啟動可以主要分為2個階段,調(diào)用AbstractApplicationContext的refresh方法和調(diào)用AbstractApplicationContext的refresh。
我們知道AbstractApplicationContext的refresh的方法是一個模板方法。幾乎所有類型的ApplicationContext的初始化都是圍繞這個refresh方法來進(jìn)行。
1. refresh方法之前
這個類Spring boot***進(jìn)行調(diào)用的類,其主要就是初始化一些BeanFactoryPostProcessor(后面會說明),或者一些在Application 初始化的時候就需要做的事情。而這些類通過通過掃描calsspath路徑下的:META-INF/spring.factories 文件中的org.springframework.context.ApplicationContextInitializer字來加載類的全路徑名,通過反射獲取對象,然后調(diào)用initialize方法。
這個和ApplicationContextInitializer加載的方式類似,也是從META-INF/spring.factories文件中的配置,主要作用就是在Spring boot的初始化不同階段會處罰不同的事件(ApplicationEvent及其子類),而這些監(jiān)聽器就會根據(jù)自己在不同事件觸發(fā)的情況下完成自己的處理邏輯。例如,ConfigFileApplicationListener負(fù)責(zé)加載配置文件。
當(dāng)然也可以通過其他方式加入beanFactory中,詳情可以參照BeanFactoryPostProcessor加入到beanFactory的方法
1.ApplicationListener的有些事件是在ApplicationContextInitializer之前觸發(fā)的
2.建議不要直接在ApplicationContextInitializer加入自己的BeanFactoryPostProcessor方法,xxxAware是不會幫你注入的。
這個就是spring的模板方法,主要有3個比較重要的接口
public interface BeanFactoryPostProcessor { void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException; }
這個方法就是給可以對beanFactory進(jìn)行一些自定義的操作,例如加入一些bean等。當(dāng)然前提就是我們定義的bean是在beanFactory中。有許多辦法可以做到
在ApplicationContextInitializer中定義加入,例如
public class MyContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {public void initialize(ConfigurableApplicationContext applicationContext) { applicationContext.addBeanFactoryPostProcessor(new MyBeanFactoryPostProcessor()); } }
通過其他BeanFactoryPostProcessor加入,可以通過注解@Import或者加載XML)
例如通過@Import(value={AnnotationBeanDefinitionRegistrar.class})
@Configurationpublic class AnnotationBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {private String BEAN_NAME = "annotationBeanPostProcessor";public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { List<String> basePackages = getPackagesToScan(importingClassMetadata);if (!registry.containsBeanDefinition(BEAN_NAME)) { addPostProcessor(registry, basePackages); } }private void addPostProcessor(BeanDefinitionRegistry registry, List<String> basePackages) { GenericBeanDefinition beanDefinition = new GenericBeanDefinition(); beanDefinition.setBeanClass(AnnotationBeanPostProcessor.class); beanDefinition.getConstructorArgumentValues() .addGenericArgumentValue(basePackages); beanDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); registry.registerBeanDefinition(BEAN_NAME, beanDefinition); }private List<String> getPackagesToScan(AnnotationMetadata metadata) { AnnotationAttributes attributes = AnnotationAttributes.fromMap( metadata.getAnnotationAttributes(EnableDubbo.class.getName())); String[] basePackages = attributes.getStringArray("basePackages");return Arrays.asList(basePackages); } }
這樣,就可以加入我們自定義的BeanFactoryPostProcessor,就可以在Bean注冊的層面上進(jìn)行開發(fā)
public interface BeanPostProcessor { Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException; Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException; }
這個接口主要就是針對在bean實例化前后做一些定制開發(fā)。一般只針對某個接口或者某個注解進(jìn)行批量操作
1. 如果你需要在SpringApplication初始化的時候就做一些事情,使用ApplicationContextInitializer
2. 如果你需要SpringApplication的某個特定階段做一些事情,使用ApplicationListener(推薦)
3. 如果你需要在beanFactory層面上開發(fā),使用BeanFactoryPostProcessor(推薦)
4. 如果你需要在對某個bean的實例化層面上開發(fā),使用BeanPostProcessor(一般業(yè)務(wù)上的開發(fā)使用InitializingBean或者init-method能夠滿足)
以上就是怎樣進(jìn)行Spring boot 啟動層面的開發(fā),小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
當(dāng)前名稱:怎樣進(jìn)行Springboot啟動層面的開發(fā)
文章轉(zhuǎn)載:http://bm7419.com/article48/jdddhp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、網(wǎng)站制作、關(guān)鍵詞優(yōu)化、網(wǎng)站建設(shè)、網(wǎng)站導(dǎo)航、標(biāo)簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)