怎么自己写一个 starter?配置提示是怎么来的?为什么我的自动配置没有生效也不报错?可选依赖怎么处理才不会在没有它的项目里炸?这篇真的写了一个库、打成 jar,放进使用方应用里逐个验证。
META-INF/spring-configuration-metadata.json 里的属性:
greeting.enabled 类型 java.lang.Boolean 默认值 True 说明「是否启用问候服务。」
greeting.prefix 类型 java.lang.String 默认值 Hello 说明「问候前缀。」
greeting.suffix 类型 java.lang.String 默认值 ! 说明「问候后缀。」类路径上有 configuration-processor,编译就会生成元数据文件。
库 jar(带 imports 文件):
GreetingService Bean = [greetingService],greet("Tom") = Hello, Tom!,GreetingDecorator Bean = []
greeting.prefix=Hi、greeting.suffix=?:
GreetingService Bean = [greetingService],greet("Tom") = Hi, Tom?,GreetingDecorator Bean = []
greeting.enabled=false:
GreetingService Bean = [],GreetingDecorator Bean = []
使用方自己定义了 GreetingService(user.service=true):
GreetingService Bean = [myService],greet("Tom") = 用户自己的 GreetingService 说:Tom,GreetingDecorator Bean = []放进 classpath 即生效,属性可覆盖,用户 Bean 让路。
库 jar(没有 imports 文件):
GreetingService Bean = [],GreetingDecorator Bean = []漏写不会报错,自动配置静默失效。
类路径上没有 optlib:
GreetingService Bean = [greetingService],greet("Tom") = Hello, Tom!,GreetingDecorator Bean = []
类路径上有 optlib:
GreetingService Bean = [greetingService],greet("Tom") = ✨Hello, Tom!✨,GreetingDecorator Bean = [fancyDecorator]用类级别条件单独保护,主体不引用可选类。
库 jar(BadAutoConfiguration 已列入 imports),类路径上没有 optlib:
启动失败:BeanCreationException ← … ← ClassNotFoundException: optlib.FancyFormatter
同一个库 jar,类路径上有 optlib:
GreetingService Bean = [greetingService],greet("Tom") = ✨Hello, Tom!✨,GreetingDecorator Bean = [fancyDecorator]方法级 @ConditionalOnClass 保护不了方法签名里的类。