成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

技巧!Spring Boot生產環境重新初始化Bean

開發 前端
為了演示我們將創建一個bean,該Bean將從配置文件中讀取配置屬性。如果文件中的屬性發生變化,則對該Bean進行重新初始化以便得到最新的數據。

1. 簡介

在本篇文章中,我將介紹在運行時重新初始化單例 Spring Bean 的方法。默認情況下,具有單例作用域的 Spring Bean 不會在應用程序生命周期中重新初始化。不過,有時可能需要重新創建 Bean,例如在更新屬性時。我將介紹幾種實現此功能的方法。

2. 實戰案例

為了演示我們將創建一個bean,該Bean將從配置文件中讀取配置屬性。如果文件中的屬性發生變化,則對該Bean進行重新初始化以便得到最新的數據。

2.1 單例Bean定義

@Component
public class ConfigManager {


  private static final Logger logger = LoggerFactory.getLogger(ConfigManager.class) ;


  private Map<String, Object> config = new HashMap<>() ;
  // 配置的是具體值是絕對路徑
  private final String filePath ;
  public ConfigManager(@Value("${pack.app.filePath}") String filePath) {
    this.filePath = filePath ;
    // 創建該bean對象時,加載配置文件信息
    initConfig() ;
  }
  private void initConfig() {
    Properties properties = new Properties() ;
    try {
      properties.load(Files.newInputStream(Paths.get(filePath))) ;
    } catch (IOException e) {
      logger.error("錯誤的加載配置文件, {}", e) ;
    }
    for (Map.Entry<Object, Object> entry : properties.entrySet()) {
      config.put(String.valueOf(entry.getKey()), entry.getValue());
    }
  }
  public Object getConfig(String key) {
    return config.get(key) ;
  }
}

接下來,在classpath下新建config.properties配置文件,配置內容如下:

pack:
  app:
    filePath: d:/pack/config.properties

下面我們可以定義一個Controller該測試當前的配置是否有問題。

@RestController
@RequestMapping("/config")
public class ConfigController {


  @Autowired
  private ConfigManager configManager;


  @GetMapping("/{key}")
  public Object get(@PathVariable String key) {
    return configManager.getConfig(key);
  }
}

默認配置文件內容

title=xxxooo1

訪問接口

圖片圖片

目前,上面的接口不管配置如何修改,在不重啟服務的情況下都無法得到最新的值;接下來我將通過幾種方式來演示如何去刷新最新的配置。

2.2 通過公共方法刷新

如果我們想要重新加載屬性而不是重新創建對象本身,我們可以簡單地創建一個公共方法來再次初始化。在我們的ConfigManager中,讓我們添加一個調用reloadConfig()方法的方法:

public void reloadConfig() {
  initConfig() ;
}

然后,當我們要重新加載屬性時,就可以調用該方法。接著在Controller中定義另一個接口,該接口調用 reloadConfig()方法:

@GetMapping("/reloadConfig")
public void reloadConfig() {
  configManager.reloadConfig() ;
}

通過測試上面的代碼,你將得到最新的配置。此種方法也是最容易想到的辦法。

2.3 使用@Lazy注解

我們可以使用@Lazy注解添加到注入的ConfigManager對象的地方,如下示例:

@Resource
@Lazy
private ConfigManager configManager;
@Value("${pack.app.filePath}")
private String filePath ;
@GetMapping("/reinitializeBean")
public void reinitializeBean() {
  DefaultSingletonBeanRegistry registry = (DefaultSingletonBeanRegistry) context.getAutowireCapableBeanFactory() ;
  // 銷毀bean;銷毀后當再次使用該bean時容器會再次執行整個創建過程
  registry.destroySingleton("configManager") ;
}

當配置發生變化后,先調用上面的/reinitializeBean接口,這會先把單例池中的實例刪除,當再次調用/title接口時就會重新創建對象了。

2.4 通過容器獲取Bean

我們可以將對應的bean銷毀,然后在使用的時候再次從容器中獲取,這時候由于已經將該單例bean銷毀,單例池中已經沒有了,所以會重新創建。

@Resource
private ApplicationContext context ;
@Value("${pack.app.filePath}")
private String filePath ;
@GetMapping("/destroyBean")
public void destroyBean() {
  DefaultSingletonBeanRegistry registry = (DefaultSingletonBeanRegistry) applicationContext.getAutowireCapableBeanFactory() ;
  registry.destroySingleton("configManager") ;
}

接下來修改使用獲取數據的接口

@GetMapping("/{key}")
public Object get(@PathVariable String key) {
  ConfigManager cm = context.getBean(ConfigManager.class) ;
  return cm.getConfig(key) ;
}

如果配置文件修改后,我們先調用/destroyBean接口,這樣當我們調用/title接口時,將會獲取到最新的配置。

責任編輯:武曉燕 來源: Spring全家桶實戰案例源碼
相關推薦

2024-10-18 11:32:15

2025-04-25 11:25:00

SpringBean初始化

2011-03-31 16:46:10

LinuxMySQL

2010-01-05 15:35:21

.NET Framew

2009-08-12 17:43:54

雙括弧Java語法技巧

2022-05-10 10:06:03

Kafka

2023-05-03 23:48:24

Spring容器初始化

2024-07-31 11:26:05

反射BeanXML

2010-02-24 15:41:19

Linux Light

2025-03-14 10:37:24

SpringSpring IOC容器

2025-05-21 10:09:09

Spring 5.xIOC編程

2023-11-12 23:08:17

C++初始化

2023-12-01 10:20:00

SpringBean參數機制

2010-02-07 14:50:46

Ubuntu配置文件

2010-03-11 19:25:35

Python環境

2010-01-22 13:16:05

VB.NET初始化數組

2023-05-08 15:55:16

MySQL數據庫

2023-04-08 14:22:16

Spring初始化對象

2021-07-12 12:20:08

Spring初始化方案

2019-11-04 13:50:36

Java數組編程語言
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人精品国产免费网站 | 国产小u女发育末成年 | 三级黄色大片网站 | 久久国产精品网 | 大乳boobs巨大吃奶挤奶 | 亚洲国产精品久久久久秋霞不卡 | 懂色av色香蕉一区二区蜜桃 | www.一区二区三区.com | 国产精品一区在线播放 | 伊人青青久久 | 欧美a区| 天天操精品视频 | 国产精品久久亚洲7777 | 日韩在线小视频 | 国产日韩一区二区三区 | 91精品国产91 | 久久国产一区二区三区 | 午夜av电影 | 亚洲一区中文字幕在线观看 | 在线观看黄色电影 | 久久久免费毛片 | 国产精品久久久亚洲 | 岛国毛片在线观看 | 久久天天 | 98久久| 国产精品久久久久久久午夜 | 色综合天天综合网国产成人网 | 久久免费精品 | av不卡一区| 久久国内| 国产精品欧美一区二区三区不卡 | 国产1区 | 狠狠色狠狠色综合日日92 | 亚洲综合在线视频 | 在线国产一区 | 国产在线精品区 | 国产一区二区三区在线 | 福利网站在线观看 | 国产aⅴ爽av久久久久久久 | 9久9久 | jlzzjlzz国产精品久久 |