簡體   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