【问题标题】:Why don't these forms of Autowire work in an @Configuration [duplicate]为什么这些形式的 Autowire 不能在 @Configuration 中工作 [重复]
【发布时间】:2015-12-31 18:09:51
【问题描述】:

关注to this question

我也试过这个,但是没有 noargs 构造函数就崩溃了(你现在可以用服务/控制器/组件来做这件事,为什么它在这里不起作用?)

@Configuration
class MyConfig {

    @Autowired
    MyConfig( final ObjectMapper mapper ) {
       ...
    }
}

但这是可行的

@Configuration // or @Service or some bean
class SomeClass ... {

    @Autowired
    private ObjectMapper objectMapper;

    @PostConstruct
    private void configureObjectMapper() {
        objectMapper.disable( SerializationFeature.WRITE_DATES_AS_TIMESTAMPS );
    }

}

为什么@Configuration 不像其他 Spring 托管类那样工作?

【问题讨论】:

  • 请告诉我们您是如何使用配置的。一个 mcve。
  • @SotiriosDelimanolis 是什么?链接的问题包含更多信息......但它们是@Configuration,它们是自动加载的,没有直接使用。 Spring Rest 和 Spring MVC 使用 ObjectMapper.
  • OP,请注意您确实拼错了注释名称。
  • @SotiriosDelimanolis 这个问题完全可以回答。这是 Spring 配置类的一个奇怪但已知的怪癖,有一个直接的答案。
  • @chrylis 哦,这是问题中的一个错字,我会解决这个问题,所有这些东西都是在本地编译的。

标签: java spring spring-java-config


【解决方案1】:

我根本不认识你的第一个例子,也不知道它会在哪里工作

第二个示例,构造函数注入,不适用于配置类,因为 Spring 在开始构建 bean 之前分析和解决依赖关系图做了很多魔术。配置类实际上是代理的,因此它们的 @Bean 方法可以进行自我调用,并且仍然可以获取单例实例(或任何适当的范围)。因为配置类可以提供它自身所依赖的 bean,所以 Spring 需要一个无参数构造函数,以便它可以一次构建一个实例。

我首选的替代方法是在我的 @Bean 方法上使用参数注入,这不需要特殊注释。

【讨论】:

  • 第一个是setter 注入的一种形式,虽然我没有设置任何东西。通常在构造 bean 时,spring 会调用带有 @Autowired 注释的 setter,它比构造函数注入更具可扩展性,但不会像字段注入那样破坏封装。虽然可能有比我正在做的更多的设置注入。
  • @Bean 的唯一问题(虽然)也许我对此也不了解,我只是在这里配置一个现有的 Bean,而不是返回一个。虽然也许@Bean 不需要返回任何东西......?
  • @xenoterracide 不过,这不是二传手。您可能想到的是一些配置器类,它们实现了用于后处理 bean 的接口。它们没有专门的注释,因为它们实现了特定的方法。
  • docs.spring.io/spring/docs/current/spring-framework-reference/… 说“您还可以将注释应用于具有任意名称和/或多个参数的方法:”
  • @xenoterracide 奇怪;我从未真正见过使用过的东西。
猜你喜欢
  • 2019-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-17
  • 1970-01-01
相关资源
最近更新 更多