Spring Boot 核心接口与扩展点详细指南

Spring Boot 核心接口与扩展点详细指南
🧑 博主简介ZEEKLOG博客专家历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c=1000,移动端可关注公众号 “ 心海云图 ” 微信小程序搜索“历代文学”)总架构师,16年工作经验,精通Java编程高并发设计分布式系统架构设计Springboot和微服务,熟悉LinuxESXI虚拟化以及云原生Docker和K8s,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分享所学,希望通过我的实践经历和见解,启发他人的创新思维。在这里,我希望能与志同道合的朋友交流探讨,共同进步,一起在技术的世界里不断学习成长。
🤝商务合作:请搜索或扫码关注微信公众号 “ 心海云图


在这里插入图片描述

Spring Boot 核心接口与扩展点详细指南

引言

Spring Boot的便捷背后,隐藏着一套精妙而强大的扩展机制。无论是容器启动的瞬间,还是Bean生命的各个阶段,亦或是Web请求的完整链路,框架都为我们预留了丰富的扩展接口。这些接口如同Spring Boot的“穴位”,掌握它们便能精准调控应用的每一个行为。

本文系统梳理了Spring Boot中二十余类核心扩展点,从ApplicationContextInitializer的启动初始化,到BeanPostProcessor的实例化干预,再到WebMvcConfigurerWeb定制,不仅详解各接口的作用与执行时机,更结合典型场景说明实践要点。

如果你希望深入理解框架原理,或是需要实现特定定制需求,这份指南都将成为你探索Spring Boot内部世界的权威手册

一、容器启动与初始化阶段

1. ApplicationContextInitializer

作用:在Spring容器刷新之前执行自定义的初始化逻辑,用于在容器启动的最早期进行配置或修改。

使用场景

  • 需要最早设置一些环境变量或系统属性
  • 注册自定义的PropertySource
  • 在容器启动前执行一些预检查或初始化工作

示例代码

// 在Spring容器刷新之前执行publicclassMyInitializerimplementsApplicationContextInitializer<ConfigurableApplicationContext>{@Overridepublicvoidinitialize(ConfigurableApplicationContext applicationContext){// 注册自定义属性源MapPropertySource propertySource =newMapPropertySource("myProperties",Collections.singletonMap("custom.key","custom-value")); applicationContext.getEnvironment().getPropertySources().addFirst(propertySource);// 设置一些系统属性System.setProperty("some.key","some-value");}}// 使用方式:META-INF/spring.factories// org.springframework.context.ApplicationContextInitializer=com.example.MyInitializer

注意事项

  • 执行时机非常早,此时Bean容器还没有创建
  • 可以通过SpringApplication.addInitializers()spring.factories注册
  • 通常用于框架级别的初始化

2. SpringApplicationRunListener

作用:监听Spring Boot应用启动的各个阶段事件,可以在不同阶段插入自定义逻辑。

使用场景

  • 监控应用启动过程,记录启动耗时
  • 在不同启动阶段执行特定逻辑(如环境准备完成后加载外部配置)
  • 实现应用启动的性能监控

核心方法

  • starting(): 应用启动开始时
  • environmentPrepared(): 环境准备完成
  • contextPrepared(): ApplicationContext准备完成
  • contextLoaded(): ApplicationContext加载完成
  • started(): 应用启动完成
  • running(): 应用运行中
  • failed(): 启动失败

3. ApplicationRunner 与 CommandLineRunner

作用:应用启动完成后执行特定业务逻辑,两者功能类似但参数类型不同。

使用场景

  • 启动后执行数据初始化
  • 启动后建立外部连接
  • 启动后发送通知或执行定时任务

区别对比

  • ApplicationRunner: 接收ApplicationArguments参数,提供更丰富的参数解析功能
  • CommandLineRunner: 接收原始字符串数组参数,更简单直接

执行顺序控制

@Component@Order(1)// 通过@Order注解或实现Ordered接口控制执行顺序publicclassFirstRunnerimplementsApplicationRunner{@Overridepublicvoidrun(ApplicationArguments args){System.out.println("第一个执行");}}

二、环境配置与属性处理

1. EnvironmentPostProcessor

作用:在Environment对象准备好后对其进行修改或增强。

使用场景

  • 从数据库、远程配置中心加载配置
  • 根据条件动态修改配置
  • 添加加密配置的解密逻辑

实战示例

publicclassRemoteConfigProcessorimplementsEnvironmentPostProcessor{@OverridepublicvoidpostProcessEnvironment(ConfigurableEnvironment env,SpringApplication app){// 从远程配置中心获取配置Map<String,Object> remoteConfig =fetchRemoteConfig();// 将远程配置添加到Environment中MapPropertySource remoteSource =newMapPropertySource("remoteConfig", remoteConfig); env.getPropertySources().addFirst(remoteSource);// 动态激活Profileif(remoteConfig.containsKey("active.profiles")){String profiles =(String) remoteConfig.get("active.profiles"); env.setActiveProfiles(profiles.split(","));}}}

2. PropertySourceLoader

作用:加载自定义格式的配置文件。

使用场景

  • 支持YAMLProperties以外的配置文件格式(如JSONXML
  • 从非标准位置加载配置文件
  • 实现配置文件的加解密加载

三、Bean定义与注册阶段

1. BeanDefinitionRegistryPostProcessor

作用:在所有Bean定义被加载后,但在Bean实例化之前,可以修改或添加Bean定义。

使用场景

  • 动态注册Bean定义(基于条件或配置)
  • 修改已注册Bean定义的属性
  • 实现Bean定义的扫描和自动注册

与BeanFactoryPostProcessor的区别

  • BeanDefinitionRegistryPostProcessor更早执行,可以注册新的Bean定义
  • BeanFactoryPostProcessor只能修改已存在的Bean定义

执行时机图解

Spring容器启动 ↓ 加载Bean定义 ↓ BeanDefinitionRegistryPostProcessor执行(可注册新Bean) ↓ BeanFactoryPostProcessor执行(只能修改已有Bean) ↓ Bean实例化 

2. ImportBeanDefinitionRegistrar

作用:与@Import注解配合使用,动态注册Bean定义到容器中。

使用场景

  • 实现类似@EnableXXX的注解驱动配置
  • 根据条件选择性注册Bean
  • 批量扫描并注册Bean

典型应用

// 1. 定义注解@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)@Import(MyComponentRegistrar.class)public@interfaceEnableMyComponents{String[]basePackages()default{};}// 2. 实现RegistrarpublicclassMyComponentRegistrarimplementsImportBeanDefinitionRegistrar{@OverridepublicvoidregisterBeanDefinitions(AnnotationMetadata metadata,BeanDefinitionRegistry registry){// 获取注解属性Map<String,Object> attrs = metadata.getAnnotationAttributes(EnableMyComponents.class.getName());String[] packages =(String[]) attrs.get("basePackages");// 扫描并注册BeanClassPathBeanDefinitionScanner scanner =newClassPathBeanDefinitionScanner(registry); scanner.scan(packages);}}// 3. 使用@EnableMyComponents(basePackages ="com.example.components")@ConfigurationpublicclassAppConfig{}

四、Bean生命周期管理

1. BeanPostProcessor

作用:在Bean初始化前后执行自定义逻辑,是Spring扩展中最常用、最强大的接口之一。

使用场景

  • Bean的代理增强(如AOP、事务)
  • Bean的属性验证或修改
  • 为Bean添加监听器或处理器
  • 实现自定义的依赖注入逻辑

执行时机

publicclassMyBeanPostProcessorimplementsBeanPostProcessor{// Bean初始化之前调用(在afterPropertiesSet和init-method之前)@OverridepublicObjectpostProcessBeforeInitialization(Object bean,String beanName){// 可以返回包装对象return bean;}// Bean初始化之后调用(在afterPropertiesSet和init-method之后)@OverridepublicObjectpostProcessAfterInitialization(Object bean,String beanName){// 通常用于返回代理对象if(bean instanceofMyService){returnProxy.newProxyInstance(...);// 创建代理}return bean;}}

重要实现类

  • AutowiredAnnotationBeanPostProcessor: 处理@Autowired注解
  • CommonAnnotationBeanPostProcessor: 处理@Resource、@PostConstruct等
  • AbstractAutoProxyCreator: AOP代理创建器

2. InstantiationAwareBeanPostProcessor

作用:在Bean实例化前后执行更细粒度的控制,甚至可以阻止默认实例化过程。

使用场景

  • 实现自定义的实例化逻辑(如使用工厂方法)
  • 在属性注入前进行验证或修改
  • 实现类似@Value的注解解析

特殊能力

publicclassMyInstantiationProcessorimplementsInstantiationAwareBeanPostProcessor{// 1. 可以完全接管Bean的实例化过程@OverridepublicObjectpostProcessBeforeInstantiation(Class<?> beanClass,String beanName){if(beanClass ==SpecialBean.class){// 返回自定义实例,Spring将跳过默认实例化returncreateSpecialBean();}returnnull;// 返回null则继续Spring默认实例化}// 2. 控制是否进行属性注入@OverridepublicbooleanpostProcessAfterInstantiation(Object bean,String beanName){if(bean instanceofReadOnlyBean){returnfalse;// 返回false则跳过属性注入}returntrue;}// 3. 处理属性值@OverridepublicPropertyValuespostProcessProperties(PropertyValues pvs,Object bean,String beanName){// 修改或添加属性值MutablePropertyValues mpvs =(pvs instanceofMutablePropertyValues)?(MutablePropertyValues) pvs :newMutablePropertyValues(pvs); mpvs.add("customProperty","customValue");return mpvs;}}

3. InitializingBean 与 DisposableBean

作用:Bean生命周期回调接口,分别在属性设置完成后和销毁前执行。

使用场景

  • Bean的初始化逻辑(如建立连接、加载数据)
  • Bean的资源清理(如关闭连接、释放资源)

对比其他方式

@ComponentpublicclassLifecycleBeanimplementsInitializingBean,DisposableBean{// 方式1:实现接口方法@OverridepublicvoidafterPropertiesSet(){System.out.println("InitializingBean.afterPropertiesSet()");}@Overridepublicvoiddestroy(){System.out.println("DisposableBean.destroy()");}// 方式2:使用JSR-250注解@PostConstructpublicvoidinit(){System.out.println("@PostConstruct");}@PreDestroypublicvoidcleanup(){System.out.println("@PreDestroy");}// 方式3:XML配置的init-method和destroy-methodpublicvoidcustomInit(){System.out.println("custom init-method");}publicvoidcustomDestroy(){System.out.println("custom destroy-method");}}// 执行顺序:@PostConstruct → InitializingBean → init-method// 销毁顺序:@PreDestroy → DisposableBean → destroy-method

4. SmartInitializingSingleton

作用:所有单例Bean都初始化完成后执行,此时所有单例Bean都已就绪。

使用场景

  • Bean之间的依赖检查
  • 启动完成后执行一些全局初始化
  • 注册Bean到中央管理器

与ApplicationRunner的区别

  • SmartInitializingSingleton: Bean级别,在所有单例Bean准备好后执行
  • ApplicationRunner: 应用级别,在Spring上下文完全启动后执行

5. Aware接口族

作用:让Bean能够感知到Spring容器中特定的对象。

常用Aware接口

  • ApplicationContextAware: 获取ApplicationContext
  • BeanFactoryAware: 获取BeanFactory
  • BeanNameAware: 获取Bean名称
  • EnvironmentAware: 获取Environment
  • ResourceLoaderAware: 获取ResourceLoader
  • MessageSourceAware: 获取MessageSource
  • ApplicationEventPublisherAware: 获取事件发布器

使用场景

@ComponentpublicclassMyServiceimplementsApplicationContextAware,EnvironmentAware{privateApplicationContext context;privateEnvironment environment;@OverridepublicvoidsetApplicationContext(ApplicationContext context){this.context = context;// 可以动态获取其他Bean或发布事件EventPublisher publisher = context.getBean(EventPublisher.class); publisher.publishEvent(newMyEvent(this));}@OverridepublicvoidsetEnvironment(Environment env){this.environment = env;// 可以读取配置String value = env.getProperty("my.config");}}

注意事项:过度使用Aware接口会使代码与Spring框架强耦合,应优先使用依赖注入。

五、条件装配与自动配置

1. Condition接口

作用:根据条件决定是否注册Bean或配置类。

Spring Boot内置条件注解

  • @ConditionalOnClass: 类路径下存在指定类时生效
  • @ConditionalOnMissingClass: 类路径下不存在指定类时生效
  • @ConditionalOnBean: 容器中存在指定Bean时生效
  • @ConditionalOnMissingBean: 容器中不存在指定Bean时生效
  • @ConditionalOnProperty: 配置属性满足条件时生效
  • @ConditionalOnExpression: SpEL表达式为true时生效
  • @ConditionalOnJava: 指定Java版本时生效
  • @ConditionalOnWebApplication: Web应用时生效
  • @ConditionalOnNotWebApplication: 非Web应用时生效

自定义条件

publicclassOnProductionConditionimplementsCondition{@Overridepublicbooleanmatches(ConditionContext context,AnnotatedTypeMetadata metadata){Environment env = context.getEnvironment();String profile = env.getProperty("spring.profiles.active","dev");return"prod".equals(profile);}}// 使用自定义条件@Configuration@Conditional(OnProductionCondition.class)publicclassProductionConfig{// 只有生产环境才生效的配置}

2. 自动配置原理

自动配置流程

  1. Spring Boot启动时加载META-INF/spring.factories中的EnableAutoConfiguration
  2. 通过AutoConfigurationImportFilter过滤不满足条件的配置
  3. 通过AutoConfigurationImportListener监听自动配置过程
  4. 按顺序应用自动配置类

自定义自动配置

// 1. 创建配置类@Configuration@ConditionalOnClass(MyService.class)// 存在MyService类时才生效@ConditionalOnMissingBean(MyService.class)// 容器中没有MyService Bean时才生效@EnableConfigurationProperties(MyProperties.class)// 启用配置属性@AutoConfigureAfter(DataSourceAutoConfiguration.class)// 在数据源配置之后publicclassMyAutoConfiguration{@Bean@ConditionalOnMissingBeanpublicMyServicemyService(MyProperties properties){returnnewMyService(properties.getUrl());}}// 2. 在META-INF/spring.factories中注册// org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.MyAutoConfiguration

六、配置属性绑定

1. @ConfigurationProperties

作用:将配置文件中的属性绑定到Java对象。

使用场景

  • 将相关配置属性分组管理
  • 提供类型安全的配置访问
  • 配置验证和默认值设置

示例

// 1. 定义配置类@ConfigurationProperties(prefix ="app.mail")@Validated// 支持JSR-303验证publicclassMailProperties{@NotEmptyprivateString host;@Min(1025)@Max(65535)privateint port =25;privateboolean sslEnabled =false;// getter/setter省略}// 2. 启用配置类@Configuration@EnableConfigurationProperties(MailProperties.class)publicclassAppConfig{}// 3. 在application.yml中配置// app:// mail:// host: smtp.example.com// port: 587// ssl-enabled: true

2. Binder

作用:编程式地将属性绑定到对象。

使用场景

  • 动态绑定配置(如从数据库加载配置)
  • 测试时手动绑定配置
  • 在非Spring管理的类中使用配置

七、Web相关扩展点

1. WebMvcConfigurer

作用:自定义Spring MVC配置。

主要配置项

  • 拦截器配置
  • 跨域配置
  • 消息转换器
  • 视图解析器
  • 静态资源处理
  • 参数解析器

实战配置

@ConfigurationpublicclassWebConfigimplementsWebMvcConfigurer{// 添加拦截器@OverridepublicvoidaddInterceptors(InterceptorRegistry registry){ registry.addInterceptor(newLogInterceptor()).addPathPatterns("/**").excludePathPatterns("/static/**");}// 配置跨域@OverridepublicvoidaddCorsMappings(CorsRegistry registry){ registry.addMapping("/api/**").allowedOrigins("https://example.com").allowedMethods("GET","POST").allowCredentials(true);}// 添加格式化器@OverridepublicvoidaddFormatters(FormatterRegistry registry){ registry.addFormatter(newDateFormatter("yyyy-MM-dd"));}// 配置消息转换器@OverridepublicvoidconfigureMessageConverters(List<HttpMessageConverter<?>> converters){ converters.add(0,newFastJsonHttpMessageConverter());}}

2. HandlerInterceptor

作用:拦截请求,在控制器执行前后进行处理。

使用场景

  • 权限验证
  • 日志记录
  • 性能监控
  • 参数预处理

执行流程

请求到达 ↓ preHandle() // 返回true继续,false中断 ↓ Controller执行 ↓ postHandle() // 渲染视图前 ↓ 渲染视图 ↓ afterCompletion() // 请求完成后 

八、事件监听

1. ApplicationListener

作用:监听Spring应用事件。

常用事件类型

  • ApplicationStartingEvent: 应用启动开始
  • ApplicationEnvironmentPreparedEvent: 环境准备完成
  • ApplicationPreparedEvent: 应用准备完成
  • ApplicationStartedEvent: 应用启动完成
  • ApplicationReadyEvent: 应用准备就绪
  • ApplicationFailedEvent: 应用启动失败
  • ContextRefreshedEvent: 上下文刷新完成
  • ContextClosedEvent: 上下文关闭

异步事件监听

@ComponentpublicclassMyEventListener{// 同步监听@EventListenerpublicvoidhandleSyncEvent(ContextRefreshedEvent event){// 同步处理}// 异步监听@Async@EventListenerpublicvoidhandleAsyncEvent(MyCustomEvent event){// 异步处理}// 条件监听@EventListener(condition ="#event.success")publicvoidhandleConditionalEvent(OrderEvent event){// 条件满足时处理}// 监听多个事件@EventListener({ContextStartedEvent.class,ContextRefreshedEvent.class})publicvoidhandleMultipleEvents(){// 处理多个事件}}

九、事务管理

1. @Transactional

作用:声明式事务管理。

传播行为

  • REQUIRED: 默认,如果存在事务则加入,否则新建
  • REQUIRES_NEW: 总是新建事务,挂起当前事务
  • NESTED: 嵌套事务
  • SUPPORTS: 支持当前事务,没有则以非事务执行
  • NOT_SUPPORTED: 非事务执行,挂起当前事务
  • NEVER: 非事务执行,有事务则抛出异常
  • MANDATORY: 必须在事务中执行,否则抛出异常

隔离级别

  • DEFAULT: 使用数据库默认
  • READ_UNCOMMITTED: 读未提交
  • READ_COMMITTED: 读已提交
  • REPEATABLE_READ: 可重复读
  • SERIALIZABLE: 串行化

2. TransactionTemplate

作用:编程式事务管理。

使用场景

  • 需要精细控制事务边界
  • 在同一个方法中需要多个独立事务
  • 事务的回滚条件复杂

十、最佳实践总结

1. 扩展点选择指南

需求场景推荐扩展点执行时机注意事项
最早介入容器启动ApplicationContextInitializer容器刷新前此时Bean还未创建
修改环境配置EnvironmentPostProcessor环境准备后可添加自定义PropertySource
动态注册BeanImportBeanDefinitionRegistrar配置类导入时与@Import配合使用
修改Bean定义BeanFactoryPostProcessorBean定义加载后不能注册新Bean
Bean初始化处理BeanPostProcessorBean初始化前后应用最广泛的扩展点
应用启动后执行ApplicationRunner应用完全启动后适合业务初始化
条件化配置@Conditional系列配置类加载时Spring Boot自动配置核心
Web MVC定制WebMvcConfigurerWeb应用启动时替代已弃用的WebMvcConfigurerAdapter
事件处理@EventListener事件发布时支持异步和条件监听

2. 执行顺序记忆口诀

启动最早Initializer, 环境配置PostProcessor。 Bean定义三剑客: RegistryPost最先到, FactoryPost紧跟随, Import注册在其中。 实例化时多拦截: Instantiation最优先, 属性注入前后调。 初始化时回调多: Aware接口先注入, PostConstruct随后到, InitializingBean接着来, BeanPostProcessor前后包。 全部就绪Singleton, 启动完成Runner跑。 

3. 常见陷阱与解决方案

陷阱1:BeanPostProcessor不生效

  • 原因BeanPostProcessor本身也是Bean,需要被容器管理
  • 解决:确保实现类被@Component扫描或通过@Bean注册

陷阱2:循环依赖

  • 原因BeanPostProcessor中依赖其他Bean可能导致循环依赖
  • 解决:实现PriorityOrdered接口提前初始化,或使用ObjectFactory延迟获取

陷阱3:执行顺序问题

  • 原因:多个同类扩展点执行顺序不确定
  • 解决:实现Ordered接口或使用@Order注解

陷阱4:过早访问Bean

  • 原因:在ApplicationContextInitializer中访问未初始化的Bean
  • 解决:将逻辑移到SmartInitializingSingletonApplicationRunner

4. 性能优化建议

  1. 延迟初始化BeanPostProcessor中避免不必要的实例化
  2. 缓存结果Condition的matches方法结果可缓存
  3. 按需注册ImportBeanDefinitionRegistrar中根据条件选择性注册
  4. 避免重量级操作ApplicationRunner中耗时应控制,避免影响启动速度

以上就是详细的Spring Boot扩展点指南,不仅列出了各个接口,还提供了实际应用场景、注意事项和最佳实践,可以帮助开发者更好地理解和应用这些强大的扩展机制,希望大家能喜欢~

Read more

Flutter 组件 csv2json 适配鸿蒙 HarmonyOS 实战:高性能异构数据转换,构建 CSV 流式解析与全栈式数据映射架构

Flutter 组件 csv2json 适配鸿蒙 HarmonyOS 实战:高性能异构数据转换,构建 CSV 流式解析与全栈式数据映射架构

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 csv2json 适配鸿蒙 HarmonyOS 实战:高性能异构数据转换,构建 CSV 流式解析与全栈式数据映射架构 前言 在鸿蒙(OpenHarmony)生态迈向工业数字化、涉及海量历史报表同步、离线数据采集及跨系统异构数据对齐的背景下,如何实现一种既能处理超大规模文本、又能保障转换极速且具备“非阻塞”特性的数据清洗方案,已成为决定应用数据吞吐能力与内存稳健性的核心因素。在鸿蒙设备这类强调 AOT 极致性能与受限内存足迹的环境下,如果应用依然采用原始的循环分割或同步全量加载 CSV,由于由于数据规模的膨胀,极易由于由于“内存瞬时爆表”导致鸿蒙应用的任务栈卡死。 我们需要一种能够流式处理(Streaming)、支持自动化字段映射(Auto-mapping)且具备零样板代码特性的转换方案。 csv2json 为 Flutter 开发者引入了“数据流变幻”范式。它将结构松散的 CSV 文本精确轰击为高维度的 JSON

By Ne0inhk
MySQL 动态分区管理:自动化与优化实践

MySQL 动态分区管理:自动化与优化实践

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[[email protected]] 📱个人微信:15279484656 🌐个人导航网站:www.forff.top 💡座右铭:总有人要赢。为什么不能是我呢? * 专栏导航: 码农阿豪系列专栏导航 面试专栏:收集了java相关高频面试题,面试实战总结🍻🎉🖥️ Spring5系列专栏:整理了Spring5重要知识点与实战演练,有案例可直接使用🚀🔧💻 Redis专栏:Redis从零到一学习分享,经验总结,案例实战💐📝💡 全栈系列专栏:海纳百川有容乃大,可能你想要的东西里面都有🤸🌱🚀 目录 * MySQL 动态分区管理:自动化与优化实践 * 一、分区的基本概念 * 二、动态分区的需求 * 三、使用存储过程动态创建分区 * 四、使用事件调度器自动化分区管理 * 五、避免分区冲突

By Ne0inhk

一文读懂Spring AOP:手把手教你优雅实现“无侵入”代码增强

目录 1.什么是Spring AOP? 2.SpringAOP优点与上手 Spring AOP 的核心术语 3.通知类型注解 4.@PointCut+@Order 5.切点表达式 6.代理模式 7.Spring AOP原理 1.什么是Spring AOP? AOP=>面向切片编程思想,是一种对一类问题集中处理的思想,比如拦截器,统一返回结果管理,统一异常处理,登录校验......如果使用OOP(面向结果编程)会让相同的代码重复多次出现,业务方法中混杂着非核心的逻辑。 Spring AOP就是为了解决这些问题存在,是AOP思想的其中一种实现方式 2.SpringAOP优点与上手 优点: * 不影响原有代码,解耦 * 便于维护功能 * 提高开发效率 * 减少重复代码 快速上手SpringAOP 编写一个使用SpringAOP计算所有方法的运行时长的例子 1.

By Ne0inhk

【Spring Boot】Spring Boot调用 WebService 接口的两种方式:动态调用 vs 静态调用 亲测有效

文章目录 * 前言 * 0、前提准备,添加依赖(Spring Boot + CXF) * 一、 方法一:动态调用 WebService(推荐用于调试) * 1. 添加依赖(Spring Boot + CXF) * 2、调用示例代码 * 3、注意事项 * 二、方法二:静态调用 WebService(推荐用于生产) * 1. 添加依赖(Spring Boot + CXF) * 2、获取 WSDL 文件 * 3、使用 `wsimport` 生成 Java 类 * 1. 检查 `wsimport` 是否存在 * 2. 进入存放 `service.wsdl`

By Ne0inhk