If you structure your code as suggested above (locating your application class in a top package), you can add @ComponentScan without any arguments or use the @SpringBootApplication annotation which implicitly includes it. All of your application components (@Component, @Service, @Repository, @Controller, and others) are automatically registered as Spring Beans.
假設你建構你的程式碼如過往建議,你可以加 @ComponentScan 不帶參數 或是 使用 @SpringBootApplication 標籤(其中包含了 @ComponentScan)。 所有你應有之中的components ( @Component, @Service, @Respotiory, @Controller 還有其他) 會自動註冊成 Spring Beans 。
以下為Annotation ComponentScan ,紅框之處有提到若沒為ComponentScan 指出要掃描的範圍,
就會掃瞄標籤標住的類別所在的整個包(package) 。
此處官方給了提供了兩個範例,其一
@Service
public class MyAccountService implements AccountService {
private final RiskAssessor riskAssessor;
public MyAccountService(RiskAssessor riskAssessor) {
this.riskAssessor = riskAssessor;
}
// ...
}
裡有一個 Service Component MyAccountService ,其實做了一個介面 AccountService。
此處 Service 有一個 私有 final 屬性 RiskAssessor ,其後設定有一個建構子初始化這個屬性,
這裡就是 constructor injection ,在前一天 Car Component 的例子,也有使用到這個方式完成相依注入(Dependency Injection)。 上方的寫法可以再透過 lombok 來做進一步的簡化,這裡需要注入 lombok (關於 lombok 關於建構子的說明提供在下方參考資料處),其 gradle 注入如下:
dependencies {
compileOnly 'org.projectlombok:lombok:1.18.30'
annotationProcessor 'org.projectlombok:lombok:1.18.30'
testCompileOnly 'org.projectlombok:lombok:1.18.30'
testAnnotationProcessor 'org.projectlombok:lombok:1.18.30'
}
MyAccountService 簡化
@Service
@RequiredArgsConstructor
public class MyAccountService implements AccountService {
private final RiskAssessor riskAssessor;
// ...
}
lombok 內建的 @RequiredArgsConstructor 會將建立一個初始化所有final和 @NonNull屬性的建構子。
此處建立的效果,就如同上方未簡化前。
另一個官方的範例:
@Service
public class MyAccountService implements AccountService {
private final RiskAssessor riskAssessor;
private final PrintStream out;
@Autowired
public MyAccountService(RiskAssessor riskAssessor) {
this.riskAssessor = riskAssessor;
this.out = System.out;
}
public MyAccountService(RiskAssessor riskAssessor, PrintStream out) {
this.riskAssessor = riskAssessor;
this.out = out;
}
// ...
}
上方連結處有兩個建構子,此處透過 @Autowired 來告訴 Spring 要它要透過哪一個建構子去生成
Spring Bean 。
參考資料
{官方} Annotation ComponentScan
{Maven} lombok cordicate
https://projectlombok.org/setup/maven
{官方} lombok 建構子說明頁面
https://projectlombok.org/features/constructor