Boot 3.3.3 自动配置实验
mvn -q -f labs/spring-senior/boot/pom.xml compile exec:java -Dexec.mainClass=study.boot.BootLab
mvn -q -f labs/spring-senior/boot/pom.xml exec:java -Dexec.mainClass=study.boot.BootLab -Dexec.args=--lab.user=true
mvn -q -f labs/spring-senior/boot/pom.xml exec:java -Dexec.mainClass=study.boot.BootLab -Dexec.args=--study.notice.enabled=false
mvn -q -f labs/spring-senior/boot/pom.xml exec:java -Dexec.mainClass=study.boot.BootLab -Dexec.args=--spring.autoconfigure.exclude=study.boot.NoticeAutoConfiguration固定Boot3.3.3 / Framework6.1.12,JDK17 API。本批实际为Liberica17.0.19+11-LTS,来源标签不等于本机JDK构建。imports必须作为资源进入classpath。程序显式使用WebApplicationType.NONE,无Web服务和外部连接,不模拟真实Servlet启动或第三方Starter全部条件。
新增两种控制输入(从仓库根执行):
mvn -q -f labs/spring-senior/boot/pom.xml compile exec:java -Dexec.mainClass=study.boot.BootLab '-Dexec.args=--lab.user=true --study.notice.enabled=false'
mvn -q -f labs/spring-senior/boot/pom.xml compile exec:java -Dexec.mainClass=study.boot.BootLab -Dexec.args=--lab.runner-fail=true统一入口 JAVA_HOME=$(/usr/libexec/java_home -v17) bash labs/spring-senior/run.sh boot;六模式本批均已通过。预期与实际对应如下:
| 输入 | Bean与定义断言 | 实际事件 |
|---|---|---|
| default | 1个auto,默认定义存在,条件匹配 | refreshed→started→runner→ready→closed |
| user | 1个user,默认定义不登记,MissingBean条件否决 | 同上 |
| disabled | 0个,属性条件否决 | 同上 |
| excluded | 0个,报告记录明确排除 | 同上 |
| user+disabled | 1个user,默认配置开关不控制用户定义 | 同上 |
| runner-fail | runner抛指定IllegalStateException;run失败 | refreshed→started→runner→failed→closed,无ready |
监听器采集真实Context/Boot事件,runner是实际ApplicationRunner;每个成功路径检查ConditionEvaluationReport、Bean数量/实现与默认定义存在性,失败路径核对异常根因。finally关闭成功或失败时已创建的Context,断言最终不active。不把任意启动异常当成预期成功。
源码推演与未测边界:Servlet生命周期/精确accept、异步warmup、外部探针、context不running分支、双Runner接口和AOT/native均未实测。详见Boot权威讲解与BootLab源码。
自动配置与注册资源
下面嵌入真正参与编译/打包的文件,不另复制Java实现。主配置没有ComponentScan,这条imports就是发现NoticeAutoConfiguration的入口。
package study.boot;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.*;
import org.springframework.context.annotation.Bean;
@AutoConfiguration
@ConditionalOnProperty(name="study.notice.enabled",havingValue="true",matchIfMissing=true)
public class NoticeAutoConfiguration {
public interface NoticeClient {String kind();}
@Bean @ConditionalOnMissingBean(NoticeClient.class)
NoticeClient noticeClient(){return ()->"auto";}
}study.boot.NoticeAutoConfiguration候选注册文件只负责发现配置类,属性条件和用户Bean退让仍在后续阶段判定。
U22:打包、应用类型与失败分析器复验
2026-10-26继续保留此机制基线,run.sh boot额外执行:PackagingDiagLab的NONE推导、缺失token校验(严格限定BindValidationException/token/NotBlank)与真实FailureAnalyzer报告;真实repackage后layertools list/extract,核对JarLauncher.class、嵌套Boot3.3.3与业务类,执行归档并读取配置元数据。提取目录清理后入口退出0。loader层并不包含manifest,检查按真实提取布局,不能凭空假定。
新增工程基线的BOM/starter、4种真实类路径、同名定义冲突/覆盖及tools提取后启动在Boot4.0.9独立实验。两次运行各自固定依赖,不把4.0.9的Deducer SPI解释成3.3.3实现。绑定来源与运行参数的完整EX1仍归U23。