最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Boot 核心接口與擴(kuò)展點(diǎn)詳細(xì)指南(最佳實(shí)踐)

 更新時(shí)間:2026年01月05日 14:35:54   作者:越重天  
本文介紹了Spring Boot的核心擴(kuò)展點(diǎn),包括容器啟動(dòng)與初始化、環(huán)境配置與屬性處理、Bean定義與注冊(cè)、Bean生命周期管理、條件裝配與自動(dòng)配置、配置屬性綁定、事務(wù)管理等,通過這些擴(kuò)展點(diǎn),開發(fā)者可以精準(zhǔn)調(diào)控應(yīng)用的每個(gè)行為,感興趣的朋友跟隨小編一起看看吧

Spring Boot 核心接口與擴(kuò)展點(diǎn)詳細(xì)指南

引言

Spring Boot的便捷背后,隱藏著一套精妙而強(qiáng)大的擴(kuò)展機(jī)制。無論是容器啟動(dòng)的瞬間,還是Bean生命的各個(gè)階段,亦或是Web請(qǐng)求的完整鏈路,框架都為我們預(yù)留了豐富的擴(kuò)展接口。這些接口如同Spring Boot的“穴位”,掌握它們便能精準(zhǔn)調(diào)控應(yīng)用的每一個(gè)行為。

本文系統(tǒng)梳理了Spring Boot中二十余類核心擴(kuò)展點(diǎn),從ApplicationContextInitializer的啟動(dòng)初始化,到BeanPostProcessor的實(shí)例化干預(yù),再到WebMvcConfigurerWeb定制,不僅詳解各接口的作用與執(zhí)行時(shí)機(jī),更結(jié)合典型場(chǎng)景說明實(shí)踐要點(diǎn)。

如果你希望深入理解框架原理,或是需要實(shí)現(xiàn)特定定制需求,這份指南都將成為你探索Spring Boot內(nèi)部世界的權(quán)威手冊(cè)。

一、容器啟動(dòng)與初始化階段

1.ApplicationContextInitializer

作用:在Spring容器刷新之前執(zhí)行自定義的初始化邏輯,用于在容器啟動(dòng)的最早期進(jìn)行配置或修改。

使用場(chǎng)景

  • 需要最早設(shè)置一些環(huán)境變量或系統(tǒng)屬性
  • 注冊(cè)自定義的PropertySource
  • 在容器啟動(dòng)前執(zhí)行一些預(yù)檢查或初始化工作

示例代碼

// 在Spring容器刷新之前執(zhí)行
public class MyInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
        // 注冊(cè)自定義屬性源
        MapPropertySource propertySource = new MapPropertySource("myProperties", 
            Collections.singletonMap("custom.key", "custom-value"));
        applicationContext.getEnvironment().getPropertySources().addFirst(propertySource);
        // 設(shè)置一些系統(tǒng)屬性
        System.setProperty("some.key", "some-value");
    }
}
// 使用方式:META-INF/spring.factories
// org.springframework.context.ApplicationContextInitializer=com.example.MyInitializer

注意事項(xiàng)

  • 執(zhí)行時(shí)機(jī)非常早,此時(shí)Bean容器還沒有創(chuàng)建
  • 可以通過SpringApplication.addInitializers()spring.factories注冊(cè)
  • 通常用于框架級(jí)別的初始化

2.SpringApplicationRunListener

作用:監(jiān)聽Spring Boot應(yīng)用啟動(dòng)的各個(gè)階段事件,可以在不同階段插入自定義邏輯。

使用場(chǎng)景

  • 監(jiān)控應(yīng)用啟動(dòng)過程,記錄啟動(dòng)耗時(shí)
  • 在不同啟動(dòng)階段執(zhí)行特定邏輯(如環(huán)境準(zhǔn)備完成后加載外部配置)
  • 實(shí)現(xiàn)應(yīng)用啟動(dòng)的性能監(jiān)控

核心方法

  • starting(): 應(yīng)用啟動(dòng)開始時(shí)
  • environmentPrepared(): 環(huán)境準(zhǔn)備完成
  • contextPrepared(): ApplicationContext準(zhǔn)備完成
  • contextLoaded(): ApplicationContext加載完成
  • started(): 應(yīng)用啟動(dòng)完成
  • running(): 應(yīng)用運(yùn)行中
  • failed(): 啟動(dòng)失敗

3.ApplicationRunner 與 CommandLineRunner

作用:應(yīng)用啟動(dòng)完成后執(zhí)行特定業(yè)務(wù)邏輯,兩者功能類似但參數(shù)類型不同。

使用場(chǎng)景

  • 啟動(dòng)后執(zhí)行數(shù)據(jù)初始化
  • 啟動(dòng)后建立外部連接
  • 啟動(dòng)后發(fā)送通知或執(zhí)行定時(shí)任務(wù)

區(qū)別對(duì)比

  • ApplicationRunner: 接收ApplicationArguments參數(shù),提供更豐富的參數(shù)解析功能
  • CommandLineRunner: 接收原始字符串?dāng)?shù)組參數(shù),更簡(jiǎn)單直接

執(zhí)行順序控制

@Component
@Order(1)  // 通過@Order注解或?qū)崿F(xiàn)Ordered接口控制執(zhí)行順序
public class FirstRunner implements ApplicationRunner {
    @Override
    public void run(ApplicationArguments args) {
        System.out.println("第一個(gè)執(zhí)行");
    }
}

二、環(huán)境配置與屬性處理

1.EnvironmentPostProcessor

作用:在Environment對(duì)象準(zhǔn)備好后對(duì)其進(jìn)行修改或增強(qiáng)。

使用場(chǎng)景

  • 從數(shù)據(jù)庫、遠(yuǎn)程配置中心加載配置
  • 根據(jù)條件動(dòng)態(tài)修改配置
  • 添加加密配置的解密邏輯

實(shí)戰(zhàn)示例

public class RemoteConfigProcessor implements EnvironmentPostProcessor {
    @Override
    public void postProcessEnvironment(ConfigurableEnvironment env, SpringApplication app) {
        // 從遠(yuǎn)程配置中心獲取配置
        Map<String, Object> remoteConfig = fetchRemoteConfig();
        // 將遠(yuǎn)程配置添加到Environment中
        MapPropertySource remoteSource = new MapPropertySource("remoteConfig", remoteConfig);
        env.getPropertySources().addFirst(remoteSource);
        // 動(dòng)態(tài)激活Profile
        if (remoteConfig.containsKey("active.profiles")) {
            String profiles = (String) remoteConfig.get("active.profiles");
            env.setActiveProfiles(profiles.split(","));
        }
    }
}

2.PropertySourceLoader

作用:加載自定義格式的配置文件。

使用場(chǎng)景

  • 支持YAML、Properties以外的配置文件格式(如JSONXML
  • 從非標(biāo)準(zhǔn)位置加載配置文件
  • 實(shí)現(xiàn)配置文件的加解密加載

三、Bean定義與注冊(cè)階段

1.BeanDefinitionRegistryPostProcessor

作用:在所有Bean定義被加載后,但在Bean實(shí)例化之前,可以修改或添加Bean定義。

使用場(chǎng)景

  • 動(dòng)態(tài)注冊(cè)Bean定義(基于條件或配置)
  • 修改已注冊(cè)Bean定義的屬性
  • 實(shí)現(xiàn)Bean定義的掃描和自動(dòng)注冊(cè)

與BeanFactoryPostProcessor的區(qū)別

  • BeanDefinitionRegistryPostProcessor更早執(zhí)行,可以注冊(cè)新的Bean定義
  • BeanFactoryPostProcessor只能修改已存在的Bean定義

執(zhí)行時(shí)機(jī)圖解

Spring容器啟動(dòng)
    ↓
加載Bean定義
    ↓
BeanDefinitionRegistryPostProcessor執(zhí)行(可注冊(cè)新Bean)
    ↓
BeanFactoryPostProcessor執(zhí)行(只能修改已有Bean)
    ↓
Bean實(shí)例化

2.ImportBeanDefinitionRegistrar

作用:與@Import注解配合使用,動(dòng)態(tài)注冊(cè)Bean定義到容器中。

使用場(chǎng)景

  • 實(shí)現(xiàn)類似@EnableXXX的注解驅(qū)動(dòng)配置
  • 根據(jù)條件選擇性注冊(cè)Bean
  • 批量掃描并注冊(cè)Bean

典型應(yīng)用

// 1. 定義注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Import(MyComponentRegistrar.class)
public @interface EnableMyComponents {
    String[] basePackages() default {};
}
// 2. 實(shí)現(xiàn)Registrar
public class MyComponentRegistrar implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata metadata, 
                                      BeanDefinitionRegistry registry) {
        // 獲取注解屬性
        Map<String, Object> attrs = metadata.getAnnotationAttributes(
            EnableMyComponents.class.getName());
        String[] packages = (String[]) attrs.get("basePackages");
        // 掃描并注冊(cè)Bean
        ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(registry);
        scanner.scan(packages);
    }
}
// 3. 使用
@EnableMyComponents(basePackages = "com.example.components")
@Configuration
public class AppConfig {}

四、Bean生命周期管理

1.BeanPostProcessor

作用:在Bean初始化前后執(zhí)行自定義邏輯,是Spring擴(kuò)展中最常用、最強(qiáng)大的接口之一。

使用場(chǎng)景

  • Bean的代理增強(qiáng)(如AOP、事務(wù))
  • Bean的屬性驗(yàn)證或修改
  • 為Bean添加監(jiān)聽器或處理器
  • 實(shí)現(xiàn)自定義的依賴注入邏輯

執(zhí)行時(shí)機(jī)

public class MyBeanPostProcessor implements BeanPostProcessor {
    // Bean初始化之前調(diào)用(在afterPropertiesSet和init-method之前)
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) {
        // 可以返回包裝對(duì)象
        return bean;
    }
    // Bean初始化之后調(diào)用(在afterPropertiesSet和init-method之后)
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) {
        // 通常用于返回代理對(duì)象
        if (bean instanceof MyService) {
            return Proxy.newProxyInstance(...); // 創(chuàng)建代理
        }
        return bean;
    }
}

重要實(shí)現(xiàn)類

  • AutowiredAnnotationBeanPostProcessor: 處理@Autowired注解
  • CommonAnnotationBeanPostProcessor: 處理@Resource、@PostConstruct等
  • AbstractAutoProxyCreator: AOP代理創(chuàng)建器

2.InstantiationAwareBeanPostProcessor

作用:在Bean實(shí)例化前后執(zhí)行更細(xì)粒度的控制,甚至可以阻止默認(rèn)實(shí)例化過程。

使用場(chǎng)景

  • 實(shí)現(xiàn)自定義的實(shí)例化邏輯(如使用工廠方法)
  • 在屬性注入前進(jìn)行驗(yàn)證或修改
  • 實(shí)現(xiàn)類似@Value的注解解析

特殊能力

public class MyInstantiationProcessor implements InstantiationAwareBeanPostProcessor {
    // 1. 可以完全接管Bean的實(shí)例化過程
    @Override
    public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) {
        if (beanClass == SpecialBean.class) {
            // 返回自定義實(shí)例,Spring將跳過默認(rèn)實(shí)例化
            return createSpecialBean();
        }
        return null; // 返回null則繼續(xù)Spring默認(rèn)實(shí)例化
    }
    // 2. 控制是否進(jìn)行屬性注入
    @Override
    public boolean postProcessAfterInstantiation(Object bean, String beanName) {
        if (bean instanceof ReadOnlyBean) {
            return false; // 返回false則跳過屬性注入
        }
        return true;
    }
    // 3. 處理屬性值
    @Override
    public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) {
        // 修改或添加屬性值
        MutablePropertyValues mpvs = (pvs instanceof MutablePropertyValues) ?
            (MutablePropertyValues) pvs : new MutablePropertyValues(pvs);
        mpvs.add("customProperty", "customValue");
        return mpvs;
    }
}

3.InitializingBean 與 DisposableBean

作用:Bean生命周期回調(diào)接口,分別在屬性設(shè)置完成后和銷毀前執(zhí)行。

使用場(chǎng)景

  • Bean的初始化邏輯(如建立連接、加載數(shù)據(jù))
  • Bean的資源清理(如關(guān)閉連接、釋放資源)

對(duì)比其他方式

@Component
public class LifecycleBean implements InitializingBean, DisposableBean {
    // 方式1:實(shí)現(xiàn)接口方法
    @Override
    public void afterPropertiesSet() {
        System.out.println("InitializingBean.afterPropertiesSet()");
    }
    @Override
    public void destroy() {
        System.out.println("DisposableBean.destroy()");
    }
    // 方式2:使用JSR-250注解
    @PostConstruct
    public void init() {
        System.out.println("@PostConstruct");
    }
    @PreDestroy
    public void cleanup() {
        System.out.println("@PreDestroy");
    }
    // 方式3:XML配置的init-method和destroy-method
    public void customInit() {
        System.out.println("custom init-method");
    }
    public void customDestroy() {
        System.out.println("custom destroy-method");
    }
}
// 執(zhí)行順序:@PostConstruct → InitializingBean → init-method
// 銷毀順序:@PreDestroy → DisposableBean → destroy-method

4.SmartInitializingSingleton

作用:所有單例Bean都初始化完成后執(zhí)行,此時(shí)所有單例Bean都已就緒。

使用場(chǎng)景

  • Bean之間的依賴檢查
  • 啟動(dòng)完成后執(zhí)行一些全局初始化
  • 注冊(cè)Bean到中央管理器

與ApplicationRunner的區(qū)別

  • SmartInitializingSingleton: Bean級(jí)別,在所有單例Bean準(zhǔn)備好后執(zhí)行
  • ApplicationRunner: 應(yīng)用級(jí)別,在Spring上下文完全啟動(dòng)后執(zhí)行

5.Aware接口族

作用:讓Bean能夠感知到Spring容器中特定的對(duì)象。

常用Aware接口

  • ApplicationContextAware: 獲取ApplicationContext
  • BeanFactoryAware: 獲取BeanFactory
  • BeanNameAware: 獲取Bean名稱
  • EnvironmentAware: 獲取Environment
  • ResourceLoaderAware: 獲取ResourceLoader
  • MessageSourceAware: 獲取MessageSource
  • ApplicationEventPublisherAware: 獲取事件發(fā)布器

使用場(chǎng)景

@Component
public class MyService implements ApplicationContextAware, EnvironmentAware {
    private ApplicationContext context;
    private Environment environment;
    @Override
    public void setApplicationContext(ApplicationContext context) {
        this.context = context;
        // 可以動(dòng)態(tài)獲取其他Bean或發(fā)布事件
        EventPublisher publisher = context.getBean(EventPublisher.class);
        publisher.publishEvent(new MyEvent(this));
    }
    @Override
    public void setEnvironment(Environment env) {
        this.environment = env;
        // 可以讀取配置
        String value = env.getProperty("my.config");
    }
}

注意事項(xiàng):過度使用Aware接口會(huì)使代碼與Spring框架強(qiáng)耦合,應(yīng)優(yōu)先使用依賴注入。

五、條件裝配與自動(dòng)配置

1.Condition接口

作用:根據(jù)條件決定是否注冊(cè)Bean或配置類。

Spring Boot內(nèi)置條件注解

  • @ConditionalOnClass: 類路徑下存在指定類時(shí)生效
  • @ConditionalOnMissingClass: 類路徑下不存在指定類時(shí)生效
  • @ConditionalOnBean: 容器中存在指定Bean時(shí)生效
  • @ConditionalOnMissingBean: 容器中不存在指定Bean時(shí)生效
  • @ConditionalOnProperty: 配置屬性滿足條件時(shí)生效
  • @ConditionalOnExpression: SpEL表達(dá)式為true時(shí)生效
  • @ConditionalOnJava: 指定Java版本時(shí)生效
  • @ConditionalOnWebApplication: Web應(yīng)用時(shí)生效
  • @ConditionalOnNotWebApplication: 非Web應(yīng)用時(shí)生效

自定義條件

public class OnProductionCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        Environment env = context.getEnvironment();
        String profile = env.getProperty("spring.profiles.active", "dev");
        return "prod".equals(profile);
    }
}
// 使用自定義條件
@Configuration
@Conditional(OnProductionCondition.class)
public class ProductionConfig {
    // 只有生產(chǎn)環(huán)境才生效的配置
}

2.自動(dòng)配置原理

自動(dòng)配置流程

  1. Spring Boot啟動(dòng)時(shí)加載META-INF/spring.factories中的EnableAutoConfiguration
  2. 通過AutoConfigurationImportFilter過濾不滿足條件的配置
  3. 通過AutoConfigurationImportListener監(jiān)聽自動(dòng)配置過程
  4. 按順序應(yīng)用自動(dòng)配置類

自定義自動(dòng)配置

// 1. 創(chuàng)建配置類
@Configuration
@ConditionalOnClass(MyService.class)  // 存在MyService類時(shí)才生效
@ConditionalOnMissingBean(MyService.class)  // 容器中沒有MyService Bean時(shí)才生效
@EnableConfigurationProperties(MyProperties.class)  // 啟用配置屬性
@AutoConfigureAfter(DataSourceAutoConfiguration.class)  // 在數(shù)據(jù)源配置之后
public class MyAutoConfiguration {
    @Bean
    @ConditionalOnMissingBean
    public MyService myService(MyProperties properties) {
        return new MyService(properties.getUrl());
    }
}
// 2. 在META-INF/spring.factories中注冊(cè)
// org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.MyAutoConfiguration

六、配置屬性綁定

1.@ConfigurationProperties

作用:將配置文件中的屬性綁定到Java對(duì)象。

使用場(chǎng)景

  • 將相關(guān)配置屬性分組管理
  • 提供類型安全的配置訪問
  • 配置驗(yàn)證和默認(rèn)值設(shè)置

示例

// 1. 定義配置類
@ConfigurationProperties(prefix = "app.mail")
@Validated  // 支持JSR-303驗(yàn)證
public class MailProperties {
    @NotEmpty
    private String host;
    @Min(1025)
    @Max(65535)
    private int port = 25;
    private boolean sslEnabled = false;
    // getter/setter省略
}
// 2. 啟用配置類
@Configuration
@EnableConfigurationProperties(MailProperties.class)
public class AppConfig {
}
// 3. 在application.yml中配置
// app:
//   mail:
//     host: smtp.example.com
//     port: 587
//     ssl-enabled: true

2.Binder

作用:編程式地將屬性綁定到對(duì)象。

使用場(chǎng)景

  • 動(dòng)態(tài)綁定配置(如從數(shù)據(jù)庫加載配置)
  • 測(cè)試時(shí)手動(dòng)綁定配置
  • 在非Spring管理的類中使用配置

七、Web相關(guān)擴(kuò)展點(diǎn)

1.WebMvcConfigurer

作用:自定義Spring MVC配置。

主要配置項(xiàng)

  • 攔截器配置
  • 跨域配置
  • 消息轉(zhuǎn)換器
  • 視圖解析器
  • 靜態(tài)資源處理
  • 參數(shù)解析器

實(shí)戰(zhàn)配置

@Configuration
public class WebConfig implements WebMvcConfigurer {
    // 添加攔截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LogInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns("/static/**");
    }
    // 配置跨域
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/api/**")
                .allowedOrigins("https://example.com")
                .allowedMethods("GET", "POST")
                .allowCredentials(true);
    }
    // 添加格式化器
    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addFormatter(new DateFormatter("yyyy-MM-dd"));
    }
    // 配置消息轉(zhuǎn)換器
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(0, new FastJsonHttpMessageConverter());
    }
}

2.HandlerInterceptor

作用:攔截請(qǐng)求,在控制器執(zhí)行前后進(jìn)行處理。

使用場(chǎng)景

  • 權(quán)限驗(yàn)證
  • 日志記錄
  • 性能監(jiān)控
  • 參數(shù)預(yù)處理

執(zhí)行流程

請(qǐng)求到達(dá)
    ↓
preHandle() // 返回true繼續(xù),false中斷
    ↓
Controller執(zhí)行
    ↓
postHandle() // 渲染視圖前
    ↓
渲染視圖
    ↓
afterCompletion() // 請(qǐng)求完成后

八、事件監(jiān)聽

1.ApplicationListener

作用:監(jiān)聽Spring應(yīng)用事件。

常用事件類型

  • ApplicationStartingEvent: 應(yīng)用啟動(dòng)開始
  • ApplicationEnvironmentPreparedEvent: 環(huán)境準(zhǔn)備完成
  • ApplicationPreparedEvent: 應(yīng)用準(zhǔn)備完成
  • ApplicationStartedEvent: 應(yīng)用啟動(dòng)完成
  • ApplicationReadyEvent: 應(yīng)用準(zhǔn)備就緒
  • ApplicationFailedEvent: 應(yīng)用啟動(dòng)失敗
  • ContextRefreshedEvent: 上下文刷新完成
  • ContextClosedEvent: 上下文關(guān)閉

異步事件監(jiān)聽

@Component
public class MyEventListener {
    // 同步監(jiān)聽
    @EventListener
    public void handleSyncEvent(ContextRefreshedEvent event) {
        // 同步處理
    }
    // 異步監(jiān)聽
    @Async
    @EventListener
    public void handleAsyncEvent(MyCustomEvent event) {
        // 異步處理
    }
    // 條件監(jiān)聽
    @EventListener(condition = "#event.success")
    public void handleConditionalEvent(OrderEvent event) {
        // 條件滿足時(shí)處理
    }
    // 監(jiān)聽多個(gè)事件
    @EventListener({ContextStartedEvent.class, ContextRefreshedEvent.class})
    public void handleMultipleEvents() {
        // 處理多個(gè)事件
    }
}

九、事務(wù)管理

1.@Transactional

作用:聲明式事務(wù)管理。

傳播行為

  • REQUIRED: 默認(rèn),如果存在事務(wù)則加入,否則新建
  • REQUIRES_NEW: 總是新建事務(wù),掛起當(dāng)前事務(wù)
  • NESTED: 嵌套事務(wù)
  • SUPPORTS: 支持當(dāng)前事務(wù),沒有則以非事務(wù)執(zhí)行
  • NOT_SUPPORTED: 非事務(wù)執(zhí)行,掛起當(dāng)前事務(wù)
  • NEVER: 非事務(wù)執(zhí)行,有事務(wù)則拋出異常
  • MANDATORY: 必須在事務(wù)中執(zhí)行,否則拋出異常

隔離級(jí)別

  • DEFAULT: 使用數(shù)據(jù)庫默認(rèn)
  • READ_UNCOMMITTED: 讀未提交
  • READ_COMMITTED: 讀已提交
  • REPEATABLE_READ: 可重復(fù)讀
  • SERIALIZABLE: 串行化

2.TransactionTemplate

作用:編程式事務(wù)管理。

使用場(chǎng)景

  • 需要精細(xì)控制事務(wù)邊界
  • 在同一個(gè)方法中需要多個(gè)獨(dú)立事務(wù)
  • 事務(wù)的回滾條件復(fù)雜

十、最佳實(shí)踐總結(jié)

1.擴(kuò)展點(diǎn)選擇指南

需求場(chǎng)景推薦擴(kuò)展點(diǎn)執(zhí)行時(shí)機(jī)注意事項(xiàng)
最早介入容器啟動(dòng)ApplicationContextInitializer容器刷新前此時(shí)Bean還未創(chuàng)建
修改環(huán)境配置EnvironmentPostProcessor環(huán)境準(zhǔn)備后可添加自定義PropertySource
動(dòng)態(tài)注冊(cè)BeanImportBeanDefinitionRegistrar配置類導(dǎo)入時(shí)與@Import配合使用
修改Bean定義BeanFactoryPostProcessorBean定義加載后不能注冊(cè)新Bean
Bean初始化處理BeanPostProcessorBean初始化前后應(yīng)用最廣泛的擴(kuò)展點(diǎn)
應(yīng)用啟動(dòng)后執(zhí)行ApplicationRunner應(yīng)用完全啟動(dòng)后適合業(yè)務(wù)初始化
條件化配置@Conditional系列配置類加載時(shí)Spring Boot自動(dòng)配置核心
Web MVC定制WebMvcConfigurerWeb應(yīng)用啟動(dòng)時(shí)替代已棄用的WebMvcConfigurerAdapter
事件處理@EventListener事件發(fā)布時(shí)支持異步和條件監(jiān)聽

2.執(zhí)行順序記憶口訣

啟動(dòng)最早Initializer,
環(huán)境配置PostProcessor。
Bean定義三劍客:
RegistryPost最先到,
FactoryPost緊跟隨,
Import注冊(cè)在其中。
實(shí)例化時(shí)多攔截:
Instantiation最優(yōu)先,
屬性注入前后調(diào)。
初始化時(shí)回調(diào)多:
Aware接口先注入,
PostConstruct隨后到,
InitializingBean接著來,
BeanPostProcessor前后包。
全部就緒Singleton,
啟動(dòng)完成Runner跑。

3.常見陷阱與解決方案

陷阱1:BeanPostProcessor不生效

  • 原因BeanPostProcessor本身也是Bean,需要被容器管理
  • 解決:確保實(shí)現(xiàn)類被@Component掃描或通過@Bean注冊(cè)

陷阱2:循環(huán)依賴

  • 原因BeanPostProcessor中依賴其他Bean可能導(dǎo)致循環(huán)依賴
  • 解決:實(shí)現(xiàn)PriorityOrdered接口提前初始化,或使用ObjectFactory延遲獲取

陷阱3:執(zhí)行順序問題

  • 原因:多個(gè)同類擴(kuò)展點(diǎn)執(zhí)行順序不確定
  • 解決:實(shí)現(xiàn)Ordered接口或使用@Order注解

陷阱4:過早訪問Bean

  • 原因:在ApplicationContextInitializer中訪問未初始化的Bean
  • 解決:將邏輯移到SmartInitializingSingletonApplicationRunner

4.性能優(yōu)化建議

  1. 延遲初始化BeanPostProcessor中避免不必要的實(shí)例化
  2. 緩存結(jié)果Condition的matches方法結(jié)果可緩存
  3. 按需注冊(cè)ImportBeanDefinitionRegistrar中根據(jù)條件選擇性注冊(cè)
  4. 避免重量級(jí)操作ApplicationRunner中耗時(shí)應(yīng)控制,避免影響啟動(dòng)速度

以上就是詳細(xì)的Spring Boot擴(kuò)展點(diǎn)指南,不僅列出了各個(gè)接口,還提供了實(shí)際應(yīng)用場(chǎng)景、注意事項(xiàng)和最佳實(shí)踐,可以幫助開發(fā)者更好地理解和應(yīng)用這些強(qiáng)大的擴(kuò)展機(jī)制,希望大家能喜歡~

到此這篇關(guān)于Spring Boot 核心接口與擴(kuò)展點(diǎn)詳細(xì)指南(最佳實(shí)踐)的文章就介紹到這了,更多相關(guān)Spring Boot 核心接口與擴(kuò)展點(diǎn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java運(yùn)行windows的cmd命令簡(jiǎn)單代碼

    java運(yùn)行windows的cmd命令簡(jiǎn)單代碼

    這篇文章主要介紹了java運(yùn)行windows的cmd命令簡(jiǎn)單代碼,有需要的朋友可以參考一下
    2013-12-12
  • SpringBoot實(shí)現(xiàn)分布式驗(yàn)證碼登錄方案小結(jié)

    SpringBoot實(shí)現(xiàn)分布式驗(yàn)證碼登錄方案小結(jié)

    驗(yàn)證碼登錄作為一種有效的防護(hù)手段,可以防止惡意gongji、暴力pojie等,本文主要介紹了SpringBoot實(shí)現(xiàn)分布式驗(yàn)證碼登錄方案小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-12-12
  • 一文詳解Java Stream的sorted自定義排序

    一文詳解Java Stream的sorted自定義排序

    Java stream中的sorted方法是用于對(duì)流中的元素進(jìn)行排序的方法,它可以接受一個(gè)comparator參數(shù),用于指定排序規(guī)則,sorted方法返回一個(gè)新的流,其中的元素按照指定的排序規(guī)則進(jìn)行排序,本文給大家詳細(xì)介紹了Java Stream的sorted自定義排序,需要的朋友可以參考下
    2025-06-06
  • 將Swagger2文檔導(dǎo)出為HTML或markdown等格式離線閱讀解析

    將Swagger2文檔導(dǎo)出為HTML或markdown等格式離線閱讀解析

    這篇文章主要介紹了將Swagger2文檔導(dǎo)出為HTML或markdown等格式離線閱讀,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-11-11
  • 詳解SpringBoot配置devtools實(shí)現(xiàn)熱部署

    詳解SpringBoot配置devtools實(shí)現(xiàn)熱部署

    本篇文章主要介紹了詳解SpringBoot配置devtools實(shí)現(xiàn)熱部署 ,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • SpringBoot項(xiàng)目打包部署到Tomcat的操作流程

    SpringBoot項(xiàng)目打包部署到Tomcat的操作流程

    在最近一個(gè)項(xiàng)目中,維護(hù)行里一個(gè)年代較為久遠(yuǎn)的單體項(xiàng)目,需要將項(xiàng)目打包放到的tomcat服務(wù)器下運(yùn)行,所以本文就給大家介紹一下SpringBoot項(xiàng)目打包部署到Tomcat的流程步驟,需要的朋友可以參考下
    2023-08-08
  • 對(duì)SpringBoot項(xiàng)目配置文件進(jìn)行加密實(shí)現(xiàn)過程

    對(duì)SpringBoot項(xiàng)目配置文件進(jìn)行加密實(shí)現(xiàn)過程

    文章介紹了如何在Spring Boot項(xiàng)目中使用Maven依賴和單元測(cè)試生成加密數(shù)據(jù),并將加密數(shù)據(jù)配置在`bootstrap.yml`或`application.yml`中,同時(shí),分享了如何在不同環(huán)境中配置加密鹽,包括IDE啟動(dòng)項(xiàng)、配置文件和Dockerfile
    2025-10-10
  • Java實(shí)現(xiàn)樹形結(jié)構(gòu)的示例代碼

    Java實(shí)現(xiàn)樹形結(jié)構(gòu)的示例代碼

    由于業(yè)務(wù)需要,后端需要返回一個(gè)樹型結(jié)構(gòu)給前端,包含父子節(jié)點(diǎn)的數(shù)據(jù)已經(jīng)在數(shù)據(jù)庫中存儲(chǔ)好。本文將為大家分享Java現(xiàn)樹形結(jié)構(gòu)的示例代碼,需要的可以參考下
    2022-05-05
  • Java正則替換手機(jī)號(hào)代碼實(shí)例

    Java正則替換手機(jī)號(hào)代碼實(shí)例

    本文的主要內(nèi)容是Java語言中正則表達(dá)式替換手機(jī)號(hào)的第4到第7位,實(shí)現(xiàn)方法十分簡(jiǎn)單,同時(shí)涉及了一些正則表達(dá)式的相關(guān)用法,需要的朋友可以參考下。
    2017-09-09
  • 關(guān)于JAVA經(jīng)典算法40題(超實(shí)用版)

    關(guān)于JAVA經(jīng)典算法40題(超實(shí)用版)

    本篇文章小編為大家介紹一下,關(guān)于JAVA經(jīng)典算法40題(超實(shí)用版),有需要的朋友可以參考一下
    2013-04-04

最新評(píng)論

汝城县| 遵义市| 应城市| 祁门县| 和静县| 城步| 昭通市| 瑞昌市| 保山市| 大港区| 淄博市| 康定县| 寿阳县| 新民市| 蚌埠市| 揭西县| 河曲县| 淮南市| 商城县| 攀枝花市| 武宁县| 敦煌市| 长兴县| 芜湖市| 佳木斯市| 岐山县| 永寿县| 晋宁县| 咸丰县| 磐石市| 彭阳县| 岫岩| 穆棱市| 黄大仙区| 且末县| 合作市| 扎囊县| 武夷山市| 拉孜县| 库伦旗| 漳浦县|