【问题标题】:Spring DI - Non-managed-object custom resolutionSpring DI - 非托管对象自定义解析
【发布时间】:2018-04-12 07:26:24
【问题描述】:

我有以下 bean/构造函数定义:

@Configuration
class Configuration {
    @Bean
    public List<Something> getSomethings(MyFancyStuff stuff, @Autowired Bar bar) {
        //...
    }
}

@Component
class SomeOtherThing {
    public SomeOtherThing(MyFancyStuff stuff, @Autowired Bar bar) {
        //...
    }
}

当找到给定参数的特定类或注释时,是否可以扩展依赖解析以提供自定义解析器?我查看了PropertyPlaceholderConfigurerInstantiationAwareBeanPostProcessor,但似乎没有什么可以帮助我编写自己的价值提供者。

作为上下文:我实现了一个自定义范围,它为它拥有的每个配置对象创建给定 bean 的许多实例。我想将此配置对象传递给所述范围的 bean-creation-process 而不将其添加到应用程序上下文中。我不想将它添加到应用程序上下文中,因为它是一个其他对象不应该能够通过依赖注入获得的对象。我需要扩展 spring 的 DI 过程,因为我想支持字段注入、构造函数注入和 bean 工厂方法,如所示 getSomethings

注意:这里不是关于 SpringMVC 请求参数的自动值转换。

【问题讨论】:

    标签: java spring dependency-injection inversion-of-control


    【解决方案1】:

    你可以使用@Conditional Annotation

      @Bean(name="dataSource")
      @Conditional(value=DevCondition.class)
      public Util getSource1() {
          return new DevUtil();
      }
    
      @Bean(name="dataSource")
      @Conditional(ProdCondition.class)
      public Util getSource2() {
          return new ProdUtil();
      }
    

    您还可以使用@Profile 根据属性值创建 bean

    【讨论】:

    • 这会在上下文启动时创建一个单例 bean,我需要一个在全局 appctx 中不可用的动态 bean 注册
    • 那你为什么要创建一个bean..你可以创建你自己的对象而不用spring注解。此对象在应用程序上下文中不可用。
    • 所有带有我的自定义注释的 bean 都应该能够获得与其实例化关联的特定值。自定义作用域对象是一个 spring bean,我想提供给所述 bean 的值不是一个 bean - 使我想要传递一个 spring bean 的值意味着任何 bean 都可以获得它,这不是我想要的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    相关资源
    最近更新 更多