[英]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
,则必须执行以下步骤:
@SpringBootApplication
添加到您的主类 @Service
或@Component
批注 如果您没有任何麻烦的包结构,并且主类包包括您要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.