【问题标题】:How to use @Autowired with Java-based config?如何在基于 Java 的配置中使用 @Autowired?
【发布时间】:2010-06-03 12:25:08
【问题描述】:

我在我的项目中使用基于 Java 的 Spring 配置,在 @Configuration 中的 @Bean-annotated 方法中指定 bean 构造。最近,最近,我开始认为使用@Autowired 从@Configuration 中删除所有不重要的bean 可能会更好,只留下它们的一小部分“根”集(关键服务和技术bean 之类的Spring MVC)。

不幸的是,Spring 似乎只有在 @Autowired 依赖项位于组件扫描包中时才能注意到它们的实现,而如果不求助于一些 XML,我就无法做到这一点。

有没有什么方法可以在不明确指定每个 bean 的情况下将 @Autowired 与基于 Java 的配置一起使用?

【问题讨论】:

  • @Autowired 在普通的@Bean 风格的配置中工作得很好,不需要组件扫描(甚至不需要)。请举例说明你有什么。
  • 例如,我有一个@Bean MyService service,它有一个@Autowired IDao dao。有interface IDaoclass DaoImpl implements IDao 并且没有IDao 的其他实现。据我了解,有必要声明 @Bean IDao dao() { return new DaoImpl } 或使用组件扫描。否则,我会收到 No matching bean of type IDao found for dependency 异常。
  • 您可以使用@ComponentScan 进行组件扫描。不需要 XML。

标签: java spring autowired


【解决方案1】:

如果我对您的理解正确,您希望 Spring 根据对 Dao 接口的自动装配依赖关系自动发现 DaoImpl 类。

这不会发生 - 您要么需要使用组件扫描,要么需要显式声明 bean,如 <bean>@Bean

原因是 Java 没有提供发现实现给定接口的类的机制,类加载器就是不能那样工作。

【讨论】:

  • 谢谢,这正是我想知道的。
【解决方案2】:

如果您通过 dao 实现 Idao,并且您希望 @Autowire 将该依赖项添加到您的参考变量中...您需要首先: 定义 bean,以便您(在基于 Java 的配置中)只需将 impl 类返回到接口。 bean 名称是您的方法名称。

当您自动装配它时,它会在您希望自动装配的参考变量和您的声明之间搜索匹配的名称。

那你会没事的。希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 2014-09-11
    相关资源
    最近更新 更多