如何将外部创建的对象实例注入到Spring Boot应用中?
外部logging、configuration Bean注入Spring Boot方案
实现方案
方案1:直接注册已就绪的外部实例(无需替换默认组件时首选)
如果你不需要覆盖Spring Boot默认的logging、配置组件,仅需要将外部创建的Bean交给Spring管理,供其他Bean注入使用,可以在Spring Boot启动阶段直接注册单例实例:
// 外部预先实例化的两个Bean CustomLogger externalLogger = createYourLoggerOutsideSpring(); CustomConfig externalConfig = loadYourConfigOutsideSpring(); SpringApplication application = new SpringApplication(YourMainApplication.class); // 添加上下文初始化器,在容器刷新前注册外部Bean application.addInitializers(context -> { context.getBeanFactory().registerSingleton("externalLoggingBean", externalLogger); context.getBeanFactory().registerSingleton("externalConfigurationBean", externalConfig); }); // 正常启动应用 application.run(args);
注册完成后,你可以在任意Spring管理的组件中通过@Autowired或者@Resource注入这两个外部Bean使用,和普通Spring内部创建的Bean没有区别。
方案2:替换Spring Boot默认的logging、配置组件
如果你要让外部创建的Bean替代Spring Boot自动生成的默认logging、配置组件,需要先排除对应自动配置,再注册外部实例:
- 第一步:在启动类的
@SpringBootApplication注解中排除对应自动配置类,避免Spring Boot创建默认实例:@SpringBootApplication(exclude = { // 替换日志组件时排除日志自动配置 org.springframework.boot.autoconfigure.logging.LoggingAutoConfiguration.class, // 替换配置组件时排除配置相关自动配置,按需调整 org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration.class }) public class YourMainApplication { public static void main(String[] args) { // 这里按照方案1的逻辑注册外部Bean再启动即可 } } - 第二步:按照方案1的逻辑注册你的外部Bean,Spring Boot启动时就会直接使用你注入的实例作为对应的组件。
注意事项
注册外部Bean时需要保证实例已经完成全部初始化工作,不要依赖Spring容器内的其他Bean完成自身初始化。如果确实需要依赖Spring内部Bean,建议调整为在Spring内部创建该Bean,或者在注册前先完成依赖的预加载。
内容的提问来源于stack exchange,提问作者user2515975
相关产品推荐
相关产品推荐

