偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

技巧!Spring Boot生產(chǎn)環(huán)境重新初始化Bean

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

1. 簡介

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

2. 實戰(zhàn)案例

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

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 ;
    // 創(chuàng)建該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配置文件,配置內(nèi)容如下:

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

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

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


  @Autowired
  private ConfigManager configManager;


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

默認(rèn)配置文件內(nèi)容

title=xxxooo1

訪問接口

圖片圖片

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

2.2 通過公共方法刷新

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

public void reloadConfig() {
  initConfig() ;
}

然后,當(dāng)我們要重新加載屬性時,就可以調(diào)用該方法。接著在Controller中定義另一個接口,該接口調(diào)用 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;銷毀后當(dāng)再次使用該bean時容器會再次執(zhí)行整個創(chuàng)建過程
  registry.destroySingleton("configManager") ;
}

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

2.4 通過容器獲取Bean

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

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

接下來修改使用獲取數(shù)據(jù)的接口

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

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

責(zé)任編輯:武曉燕 來源: Spring全家桶實戰(zhàn)案例源碼
相關(guān)推薦

2024-10-18 11:32:15

2025-04-25 11:25:00

SpringBean初始化

2011-03-31 16:46:10

LinuxMySQL

2009-08-12 17:43:54

雙括弧Java語法技巧

2010-01-05 15:35:21

.NET Framew

2023-05-03 23:48:24

Spring容器初始化

2022-05-10 10:06:03

Kafka

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參數(shù)機制

2010-03-11 19:25:35

Python環(huán)境

2010-02-07 14:50:46

Ubuntu配置文件

2010-01-22 13:16:05

VB.NET初始化數(shù)組

2023-05-08 15:55:16

MySQL數(shù)據(jù)庫

2009-09-08 09:48:34

LINQ初始化數(shù)組

2009-11-11 15:29:15

ADO初始化

2019-11-04 13:50:36

Java數(shù)組編程語言
點贊
收藏

51CTO技術(shù)棧公眾號