iT邦幫忙

2023 iThome 鐵人賽

DAY 10
0
自我挑戰組

探索 Spring Boot Doc系列 第 10

Doc 6.5 Spring Beans and Dependency Injection (二)

  • 分享至 

  • xImage
  •  

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) 。

https://ithelp.ithome.com.tw/upload/images/20230925/201617705oV6qfGItE.png

此處官方給了提供了兩個範例,其一

@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

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/ComponentScan.html

{Maven} lombok cordicate

https://projectlombok.org/setup/maven

{官方} lombok 建構子說明頁面

https://projectlombok.org/features/constructor


上一篇
Doc 6.5 Spring Beans and Dependency Injection (一)
下一篇
Doc 6.6 & Doc 6.7.2 Running as a Packaged Application
系列文
探索 Spring Boot Doc30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言