【问题标题】:How to @Autowire services in SpringBoot如何在 Spring Boot 中 @Autowire 服务
【发布时间】:2017-09-18 20:16:30
【问题描述】:

大家好。在使用 Springboot 时,我有一个关于将服务自动装配到我的类中的问题。我在互联网上以及 Springboot 规范中看到的所有示例都做了类似的事情(摘自 Springboot 版本 1.5.7 规范):

package com.example.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class DatabaseAccountService implements AccountService {
private final RiskAssessor riskAssessor;

@Autowired
public DatabaseAccountService(RiskAssessor riskAssessor) {
this.riskAssessor = riskAssessor;
}
// ...
}

这是一个通过其构造函数注入属性的类,通过 @Autowiring 构造函数。另一种形式是像这样@Autowire 属性:

@Autowired
private final RiskAssessor riskAssessor

但是,在我工作的地方,为了使这两种方法起作用,我被告知我需要使用这种方法:

 applicationContext.getAutowireCapableBeanFactory().autowireBean(Object.class)

他们告诉我,我需要这个才能使 @Autowired 注释起作用。

现在我的问题是:为什么没有简单的注释可以让@Autowire 正常工作? (类似于@AutowiredClass)。上面的方法太冗长而且很难记住,所以肯定有更好的方法让@Autowired 在类上工作以便注入服务,就像我们在 Grails 中所做的那样,我们只是说 def someService 并且它会自动注入.

【问题讨论】:

  • 你的问题有点不清楚......你的意思是applicationContext.getAutowireCapableBeanFactory().autowireBean(DatabaseAccountService.class)吗?如果“是”,那么不,你不需要那个。只需正确配置“组件扫描”即可。
  • 我认为你不需要对应用程序上下文做任何特殊的事情。确保在 Spring 配置中的某处创建了 RiskAssessor bean。
  • 在Spring boot中,不需要,只要你在Main类包或其子包中即可
  • @Tom 是的,是您问题的答案
  • @Greg 那你就不需要那行了。请检查现有答案,如果它们不能帮助您解决问题,请相应地更新您的问题并添加RiskAssessor 的 sn-p 以显示其注释方式。

标签: java spring spring-boot autowired


【解决方案1】:

如果您想在您的 spring-boot 应用程序中正确使用 @Autowired,您必须执行以下步骤:

  1. @SpringBootApplication添加到您的主类中
  2. @Service@Component 注释添加到要注入的类中
  3. 使用您所描述的两种方式中的一种进行自动装配

【讨论】:

  • 我想我错过了将@Component 添加到我想要注入服务的类的部分。当我有时间并检查您的解决方案时将对此进行测试,因为它提供了更多详细信息。
【解决方案2】:

如果你没有任何奇怪的包结构,并且主类包包括你希望 spring 实例化的所有其他类(直接或在子包中)一个简单的注释 @ComponentScan 在你的主类上将帮助你保存所有这些样板代码。然后 spring 会发挥作用,它会扫描包(和子包)并查找用@Service@Component 等注释的类并实例化它。

更好的是,在你的主类中使用@SpringBootApplication,这也将涵盖@Configuration。如果它是一个绿地项目,我会鼓励从start.spring.io - spring 的模板生成/脚手架工具开始

【讨论】:

  • 在我想注入服务的类中是否需要@Component 扫描?
【解决方案3】:

现在我的问题是:为什么没有简单的注释可以让@Autowire 正常工作?

有:@SpringBootApplication

如果您将它放在应用程序的根目录(包含主类的文件)并且只要您的服务在同一个包或子包中,Spring 就会自动发现、实例化并注入正确的类。

本演练中有一个示例:REST Service with Spring Boot

如该页面所述:

@SpringBootApplication 是一个方便的注解,它添加了以下所有内容: @Configuration 将类标记为应用程序上下文的 bean 定义源。 @EnableAutoConfiguration 告诉 Spring Boot 根据类路径设置、其他 bean 和各种属性设置开始添加 bean。 @ComponentScan 告诉 Spring 在 hello 包中查找其他组件、配置和服务,使其能够找到控制器。

【讨论】:

    【解决方案4】:

    您需要将RestService 的实现注释为@Service@Component,这样Spring 会选择它。

    @Service
    public class MyRiskAssessorImpl implements RiskAssessor {
    ///
    }
    

    【讨论】:

    • 你的意思是我需要用@Component注释我的类将接收我的注入服务,以便@Autowired可以用于在我的类中注入服务?
    • 我的意思是你需要注释将成为@Autowired的类
    【解决方案5】:

    @Autowired 几乎可以开箱即用。只需对要自动装配的类进行组件扫描,就完成了。只要确保您的主类(或主配置类)使用@ComponentScan("{com.example.app}")@SpringBootApplication(主类)。 docs这个东东解释的挺好的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多