spring應用中,配置類的初始化時機和方式至關重要。本文分析一個實際案例,指出其潛在風險并提供更優解。
案例: 開發者在AppConfig配置類中,于構造函數內從數據庫讀取配置數據:
@Configuration @Data public class AppConfig { private String some; @Autowired public AppConfig(ConfigMapper configMapper) { System.out.println("---------------"); List<ConfigDO> all = configMapper.selectList(); // 假設ConfigDO為數據庫實體類 System.out.println(all); this.some = ...; // 省略具體賦值邏輯 } }
盡管ide報錯“could not autowire. no beans of ‘configmapper’ type found.”,程序卻能正常運行并讀取數據。這種現象暗藏風險。
問題分析: 將數據庫讀取置于AppConfig類的構造函數中,雖然運行正常,但與@Configuration注解的最佳實踐相悖。@Configuration通常與@Bean注解配合,定義和配置Bean。而此處,AppConfig自身即為一個Bean,在構造函數中直接進行數據庫操作,語義沖突。雖然Spring 4.x及以上版本允許在構造函數上省略@Autowired注解,但這種做法并非最佳實踐。
更優解決方案: 為提高代碼清晰度和可維護性,建議采用以下Spring提供的初始化方式:
- 使用@Component注解替代@Configuration: 如果AppConfig并非用于配置其他Bean,則使用@Component更合適。
- 實現InitializingBean接口,重寫afterPropertiesSet()方法: 此方法在所有Bean屬性注入完成后調用。
- 使用@PostConstruct注解標記初始化方法: 該注解標記的方法會在Bean初始化后執行。
- 實現ApplicationRunner或CommandLineRunner接口: 這兩個接口提供在spring容器啟動后執行特定任務的機制。
- 使用@Configuration + @Bean: 將數據庫讀取邏輯封裝在一個獨立的@Bean方法中,更清晰地分離關注點。
這些方法確保Spring容器啟動后執行數據庫讀取操作,更符合Spring編碼規范,提高代碼可讀性和可維護性,避免潛在的耦合問題。 選擇哪種方式取決于具體應用場景和個人偏好。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END