SpringCloud 刷新范圍

2023-06-06 17:10 更新

進(jìn)行配置更改時(shí),標(biāo)記為?@RefreshScope?的Spring ?@Bean?將得到特殊處理。此功能解決了狀態(tài)beans的問題,該狀態(tài)僅在初始化時(shí)才注入配置。例如,如果通過?Environment?更改數(shù)據(jù)庫URL時(shí)DataSource具有打開的連接,則您可能希望這些連接的持有者能夠完成他們正在做的事情。然后,下次某物從池中借用一個(gè)連接時(shí),它將獲得一個(gè)具有新URL的連接。

有時(shí),甚至可能必須將?@RefreshScope?批注應(yīng)用到只能初始化一次的某些beans上。如果bean是“不可變的”,則必須用?@RefreshScope?注釋bean或在屬性鍵?spring.cloud.refresh.extra-refreshable?下指定類名。

重要

如果您自己創(chuàng)建一個(gè)?DataSource? bean,而實(shí)現(xiàn)是一個(gè)?HikariDataSource?,則返回最特定的類型,在這種情況下為?HikariDataSource?。否則,您將需要設(shè)置?spring.cloud.refresh.extra-refreshable=javax.sql.DataSource?。

刷新作用域beans是惰性代理,它們?cè)谑褂脮r(shí)(即在調(diào)用方法時(shí))進(jìn)行初始化,并且作用域充當(dāng)初始化值的緩存。若要強(qiáng)制bean在下一個(gè)方法調(diào)用上重新初始化,必須使它的緩存條目無效。

?RefreshScope?在上下文中是bean,并具有公用的?refreshAll()?方法,可通過清除目標(biāo)緩存來刷新作用域中的所有beans。?/refresh?端點(diǎn)公開了此功能(通過HTTP或JMX)。要按名稱刷新單個(gè)bean,還有一個(gè)?refresh(String)?方法。

要公開?/refresh?端點(diǎn),您需要在應(yīng)用程序中添加以下配置:

management:
  endpoints:
    web:
      exposure:
        include: refresh

?@RefreshScope?在?@Configuration?類上(在技術(shù)上)有效,但是可能會(huì)導(dǎo)致令人驚訝的行為。例如,這并不意味著該類中定義的所有?@Beans?本身都在?@RefreshScope?中。具體而言,除非刷新本身在?@RefreshScope?中,否則依賴那些beans的任何內(nèi)容都不能依賴于刷新啟動(dòng)時(shí)對(duì)其進(jìn)行更新。在這種情況下,將在刷新時(shí)重建它,并重新注入其依賴項(xiàng)。此時(shí),它們將從刷新的?@Configuration?重新初始化。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)