[英]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.