- 直接排除(最快,零代码改动)
application.yml / properties
spring:
autoconfigure:
exclude:
- com.xxx.FaultyAutoConfiguration # 整个配置类
- com.xxx.FaultyBean # 单个 Bean 也可通过 @ConditionalOnProperty 关闭适用:这个 Bean 是通过 starter 自动配置进来的,直接一键干掉。
@ConditionalOnProperty/@ConditionalOnExpression(开关式)
java
@Bean
@ConditionalOnProperty(name = "feature.faulty.enabled", havingValue = "true", matchIfMissing = false)
public FaultyBean faultyBean() { ... }启动时加参数:
java -jar app.jar --feature.faulty.enabled=false适用:自己写的 Bean,不想删代码,只想临时关闭。
@Lazy延迟初始化(容器启动成功,第一次注入时才报错)
java
@Component
@Lazy
public class FaultyBean { ... }或在使用方注入:
java
@Autowired
@Lazy
private FaultyBean faultyBean; // 启动阶段不实例化适用:Bean 创建耗时/依赖外部资源,但偶尔才用到;启动期先跳过,真正调用时再失败,不影响整体可用性。
spring.main.lazy-initialization=true(全局懒加载)
application.yml 里一行即可:
spring:
main:
lazy-initialization: true启动后所有单例 Bean 第一次被注入/调用时才实例化。
风险:启动日志不会暴露潜在问题,线上要慎重。
- 自定义
BeanFactoryPostProcessor删除 BeanDefinition(彻底摘除)
java
@Component
public class RemoveFaultyBean implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
if (beanFactory.containsBeanDefinition("faultyBean")) {
((BeanDefinitionRegistry) beanFactory).removeBeanDefinition("faultyBean");
}
}
}适用:无法通过 exclude、条件注解排除,需要运行时动态摘除。
- 使用
@Profile("!skipFaulty")隔离
java
@Component
@Profile("!skipFaulty")
public class FaultyBean { ... }启动时指定 profile:
java -jar app.jar --spring.profiles.active=skipFaulty适用:需要同时保留“正常启动”和“跳过启动”两种启动模式。
实战小结
• 只是某个自动配置类导致启动失败 → 方案 1 最快速。
• 自己的 Bean 依赖外部服务 → 方案 2/3 最灵活。
• 需长期维护“跳过”逻辑 → 方案 4/6。
把项目先跑起来,修好真正的问题后再把开关或排除项去掉即可。
(1) @Lazy
java
@Component
@Lazy
public class HeavyService { ... }(2) ObjectProvider
java
@Autowired
ObjectProvider<HeavyService> provider;
public void biz() { provider.getIfAvailable(); }(3) @ConditionalOnProperty 动态开关
(4) 自己写 SmartInitializingSingleton,在第一次调用 getBean 时才 new HeavyService(),然后手动注册 Singleton。