Spring Boot如何在啓動後訪問數據庫並將數據庫中的數據作爲全局應用程序共享對象存儲到ServletContext中。
使用Spring Boot的監聽器
查看Spring Boot的官方文檔,其內容有如下一段:
If you want those listeners to be registered automatically, regardless of the way the application is created, you can add a
META-INF/spring.factories
file to your project and reference your listener(s) by using theorg.springframework.context.ApplicationListener
key, as shown in the following example:org.springframework.context.ApplicationListener=com.example.project.MyListener
由上述可以知道,實現自動註冊的監聽器,可以通過實現ApplicationListener
接口,實現其中的方法完成監聽器的註冊。
在進行監聽器註冊時選擇的觸發事件類型是:ApplicationStartedEvent
,在官方文檔中的解釋如下 :
An
ApplicationReadyEvent
is sent after any application and command-line runners have been called. It indicates that the application is ready to service requests.
可以知道事件觸發的時機是在Spring Boot啓動後,而用戶請求發送之前觸發。
程序如下:
其中BlogSetting
爲實體類,BlogSettingService
爲MVC模式中的Service層(這兩點不必深究,僅僅爲了寫個示例程序)
@Componentpublic
class BlogSettingInit implements ApplicationListener {
@Autowired
private BlogSettingService blogSettingService;
public void onApplicationEvent(ApplicationReadyEvent applicationReadyEvent) {
ServletContext servletContext = ((WebApplicationContext) applicationReadyEvent.getApplicationContext()).getServletContext();
List blogSettings = blogSettingService.findBlogSetting();
if (blogSettings.isEmpty() || blogSettings == null) {
BlogSetting blogSetting = new BlogSetting();
BlogSetting blogSetting1 = blogSettingService.BlogSettingSaveOrUpdate(blogSetting);
blogSetting.setId(blogSetting1.getId());
servletContext.setAttribute("setting", blogSetting);
} else {
servletContext.setAttribute("setting", blogSettings.get(0));
}
}
}
實現方式除上述一種外 ,亦可以使用註解的方式:
@Component
public class BlogSettingInit {
@Autowired
private BlogSettingService blogSettingService;
@EventListener
public void init(ApplicationReadyEvent applicationReadyEvent) {
ServletContext servletContext = ((WebApplicationContext)applicationReadyEvent.getApplicationContext()).getServletContext();
List blogSettings = blogSettingService.findBlogSetting();
if (blogSettings.isEmpty() || blogSettings == null) {
BlogSetting blogSetting = new BlogSetting();
BlogSetting blogSetting1 = blogSettingService.BlogSettingSaveOrUpdate(blogSetting);
blogSetting.setId(blogSetting1.getId());
servletContext.setAttribute("setting", blogSetting);
} else {
servletContext.setAttribute("setting", blogSettings.get(0));
}
}
}