繁体   English   中英

如何在SpringBoot中@Autowire服务

[英]How to @Autowire services in SpringBoot

大家好 我在使用Springboot时有一个关于将服务自动装配到类中的问题。 我在Internet以及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并自动注入。

如果要在Spring-boot应用程序中正确使用@Autowired ,则必须执行以下步骤:

  1. @SpringBootApplication添加到您的主类
  2. 在要注入的类中添加@Service@Component批注
  3. 使用您描述的两种方式中的一种自动接线

如果您没有任何麻烦的包结构,并且主类包包括您要spring实例化的所有其他类(直接或在子包中),则在主类上使用简单的批注@ComponentScan可以帮助您保存所有这些样板代码。 然后spring会做魔术,它将去扫描包(和子包)并查找带有@Service @Component@Service @Component等注释的@Component并将其实例化。

更好的是,在您的主类中使用@SpringBootApplication ,这也将涉及@Configuration 如果这是一个绿色项目,我鼓励从start.spring.io-一个用于spring的模板生成/脚手架工具开始

现在我对您的问题是:为什么没有简单的注释可以使@Autowire正常运行?

有: @SpringBootApplication

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

本演练中有一个示例: Spring Boot的REST服务

如该页面中所述:

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

您需要将RestService的实现注释为@Service@Component以便Spring可以选择它。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM