成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

談談Spring boot 啟動層面的開發

開發 后端
Spring boot 的優點和缺點不再討論的范疇,只是單純的談一談Spring boot的啟動過程

Spring boot的啟動可以主要分為2個階段。1 是調用AbstractApplicationContext的refresh方法之前和調用AbstractApplicationContext的refresh。 我們知道AbstractApplicationContext的refresh的方法是一個模板方法。幾乎所有類型的ApplicationContext的初始化都是圍繞這個refresh方法來進行。

[[184665]]

1. refresh方法之前

1.1 ApplicationContextInitializer

這個類Spring boot***進行調用的類,其主要就是初始化一些BeanFactoryPostProcessor(后面會說明),或者一些在Application 初始化的時候就需要做的事情。而這些類通過通過掃描calsspath路徑下的:META-INF/spring.factories 文件中的org.springframework.context.ApplicationContextInitializer字來加載類的全路徑名,通過反射獲取對象,然后調用initialize方法。

1.2 ApplicationListener

這個和ApplicationContextInitializer加載的方式類似,也是從META-INF/spring.factories文件中的配置,主要作用就是在Spring boot的初始化不同階段會處罰不同的事件(ApplicationEvent及其子類),而這些監聽器就會根據自己在不同事件觸發的情況下完成自己的處理邏輯。例如,ConfigFileApplicationListener負責加載配置文件。

當然也可以通過其他方式加入beanFactory中,詳情可以參照BeanFactoryPostProcessor加入到beanFactory的方法

1.ApplicationListener的有些事件是在ApplicationContextInitializer之前觸發的

2.建議不要直接在ApplicationContextInitializer加入自己的BeanFactoryPostProcessor方法,xxxAware是不會幫你注入的。

2. refresh方法

這個就是spring的模板方法,主要有3個比較重要的接口

2.1 BeanFactoryPostProcessor

public interface BeanFactoryPostProcessor {
    
   void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;

}

這個方法就是給可以對beanFactory進行一些自定義的操作,例如加入一些bean等。當然前提就是我們定義的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})

@Configuration
public 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注冊的層面上進行開發

2.2 BeanPostProcessor

public interface BeanPostProcessor {
  
   Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;

   Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;

}

這個接口主要就是針對在bean實例化前后做一些定制開發。一般只針對某個接口或者某個注解進行批量操作

 

3. 綜述

1. 如果你需要在SpringApplication初始化的時候就做一些事情,使用ApplicationContextInitializer

2. 如果你需要SpringApplication的某個特定階段做一些事情,使用ApplicationListener(推薦)

3. 如果你需要在beanFactory層面上開發,使用BeanFactoryPostProcessor(推薦)

4. 如果你需要在對某個bean的實例化層面上開發,使用BeanPostProcessor(一般業務上的開發使用InitializingBean或者init-method能夠滿足)

轉載請注明出處:https://my.oschina.net/u/3039671/blog/852211

例子,Spring boot風格使用dubbo

碼云:https://git.oschina.net/null_584_3382/spring-dubbo-parent

github: https://github.com/Athlizo/spring-dubbo-parent

責任編輯:張燕妮 來源: 開源中國社區
相關推薦

2023-09-27 08:14:56

2023-06-02 16:24:46

SpringBootSSM

2024-12-16 08:10:00

Spring開發

2025-06-19 09:53:30

Spring性能優化服務器

2010-04-01 16:38:06

云計算

2022-03-25 07:39:09

OSMySQL層面

2012-06-12 11:40:39

商務辦公戴爾

2017-08-02 14:44:06

Spring Boot開發注解

2021-02-25 14:11:10

數據安全網絡安全數字經濟

2018-05-25 16:32:45

Spring BootJava開發

2016-10-14 14:16:28

Spring BootJava應用

2016-11-03 09:59:38

kotlinjavaspring

2023-03-20 13:41:00

IoC容器Spring

2015-07-08 10:37:12

MySQL高可用架構業務架構

2012-02-17 10:22:31

2017-07-20 17:10:38

數據庫DB分庫sharding

2019-01-15 11:40:14

開發技能代碼

2019-04-15 08:32:25

Spring Boot日志門面模式

2025-02-19 12:00:00

SpringBootDeepSeekAI

2019-01-31 13:43:48

Spring BootStarter開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩不卡视频在线观看 | 九九爱这里只有精品 | 麻豆精品国产91久久久久久 | 999热精品 | 日本一区二区不卡视频 | 国产精品毛片久久久久久久 | 日本字幕在线观看 | 日本精品久久久久 | 成人国产精品色哟哟 | 九九热这里只有精品6 | 欧美乱码精品一区二区三区 | 91影院 | 国产色网 | 国产一级片在线播放 | 日韩爱爱网 | 日韩精品免费在线观看 | 精品国产一区一区二区三亚瑟 | 久久综合久久综合久久 | av在线免费观看网址 | 免费成人在线网站 | 成人国产精品 | 欧美日韩成人在线 | v亚洲 | 一区在线免费视频 | 亚洲色视频 | 婷婷成人在线 | 农村妇女毛片精品久久久 | 欧美韩一区二区三区 | 亚洲精品第一页 | 欧美视频三级 | aaaaaaa片毛片免费观看 | 91porn国产成人福利 | 欧美欧美欧美 | 一区二区三区在线看 | 亚洲欧美综合精品另类天天更新 | 91精品国产乱码久久久久久久 | 国产精品美女久久久久久免费 | 久久一区二区三区四区 | 亚洲精品中文字幕中文字幕 | 国产精品日韩欧美一区二区三区 | 国产精品毛片 |