Skip to content

  1. 直接排除(最快,零代码改动)
    application.yml / properties
spring:
  autoconfigure:
    exclude:
      - com.xxx.FaultyAutoConfiguration   # 整个配置类
      - com.xxx.FaultyBean                # 单个 Bean 也可通过 @ConditionalOnProperty 关闭

适用:这个 Bean 是通过 starter 自动配置进来的,直接一键干掉。

  1. @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,不想删代码,只想临时关闭。

  1. @Lazy 延迟初始化(容器启动成功,第一次注入时才报错)
java
@Component
@Lazy
public class FaultyBean { ... }

或在使用方注入:

java
@Autowired
@Lazy
private FaultyBean faultyBean;   // 启动阶段不实例化

适用:Bean 创建耗时/依赖外部资源,但偶尔才用到;启动期先跳过,真正调用时再失败,不影响整体可用性。

  1. spring.main.lazy-initialization=true(全局懒加载)
    application.yml 里一行即可:
spring:
  main:
    lazy-initialization: true

启动后所有单例 Bean 第一次被注入/调用时才实例化。
风险:启动日志不会暴露潜在问题,线上要慎重。

  1. 自定义 BeanFactoryPostProcessor 删除 BeanDefinition(彻底摘除)
java
@Component
public class RemoveFaultyBean implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
        if (beanFactory.containsBeanDefinition("faultyBean")) {
            ((BeanDefinitionRegistry) beanFactory).removeBeanDefinition("faultyBean");
        }
    }
}

适用:无法通过 exclude、条件注解排除,需要运行时动态摘除。

  1. 使用 @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。