承接上回,關於延遲加載(Lazy Initialization),如果你想要在開啟延遲加載情況下,
針對特定 bean 關閉延遲的話,可以透過 @Lazy(false) 去做關閉,
這樣在初始的情況下就會去創建這些bean 。
但其實我們不一定要先在註冊檔案開啟延遲加載,在透過 @Lazy(false) 去關閉特定 bean。
下方為一個透過 @Lazy 關閉延遲加載的範例
spring:
main:
lazy-initialization: true
datasource:
url: jdbc:h2:mem:mydb
username: sa
password: password
driverClassName: org.h2.Driver
jpa:
spring.jpa.database-platform: org.hibernate.dialect.H2Dialect
solr:
url: http://localhost:8983/solr
主要註冊類別,透過標籤關閉 bean solrClient 的延遲加載
@Configuration
public class SolrConfig {
@Value("${solr.url}")
private String solrUrl;
@Bean
@Lazy(false)
public SolrClient solrClient() {
return new HttpSolrClient.Builder(solrUrl).build();
}
}
@Lazy 除了可以關閉延遲加載之外,也可以開啟特定bean 的延遲加載。
我們現在都是透過註冊檔案開啟延遲加載,這種方式就是所有的bean都是延遲加載,
但其實可以不需要在註冊檔案中開啟延遲加載,單獨透過 @Lazy 方式去開起特定bean的延遲加載。
下方 application.yml 沒有開啟延遲加載
spring:
datasource:
url: jdbc:h2:mem:mydb
username: sa
password: password
driverClassName: org.h2.Driver
jpa:
spring.jpa.database-platform: org.hibernate.dialect.H2Dialect
solr:
url: http://localhost:8983/solr
@Lazy 預設就是 true,放在 bean solrClient 就會開啟他的延遲加載
@Configuration
public class SolrConfig {
@Value("${solr.url}")
private String solrUrl;
@Bean
@Lazy
public SolrClient solrClient() {
return new HttpSolrClient.Builder(solrUrl).build();
若是放在註冊類別上方,就會將下方的所有 bean 都開啟延遲加載
@Lazy
@Configuration
public class SolrConfig {
//各種bean 的註冊
}
上方為 Annotation Lazy 的文件說明,執得注意的是如果 @Lazy 出現在註冊類別之上,但 @Lazy(false) 出現在 bean method 之上,那後者 @Lazy(false) 就會覆蓋前者的行為。
參考資料
{官方} Annotation Lazy 文件
Lazy Loading in Spring Beans
https://medium.com/@omernaci/lazy-loading-in-spring-beans-e6a9945e874d