1.概述
在java日常業務開發中我們經常有可能讀取一些自定義配置或者文件。比如說公私鑰文件、一些固定的詞典文件之類的,這一類統稱為資源(Resource)。很多情況下都是自己寫IO來讀取。今天開始你可以不用在造輪子了。因為Spring自帶有資源加載功能,甚至還有非常便利的方法將讀取的內容注入Spring bean。接下來我們就來見識一下吧。
2.通過Resource接口
我們可以使用Resource接口簡化資源文件的定位。Spring幫助我們使用資源加載器查找和讀取資源,資源加載器根據提供的路徑決定選擇哪個Resource實現。
2.1 使用Resource的實現類
org.springframework.core.io.Resource接口常用的有兩個實現類:
org.springframework.core.io.ClassPathResource 用來加載classpath下的資源,我們直接讀取springboot 配置文件 application.properties,其中已經寫入了一個配置 server.port=8080
org.springframework.core.io.FileSystemResource 用來加載系統文件,通常通過文件的絕對或者相對路徑來讀取。上面的例子我們用這個來試一試。不同的是這次我們需要文件的路徑。
2.2 使用ResourceLoader
如果你業務中需要使用延遲加載,我們可以使用類ResourceLoader:
我們也可以使用@Autowired將ResourceLoader注入我們的bean :
根據上圖ApplicationContext 繼承了ResourceLoader 接口。因此我們可以通過Spring bean 注入的方式來讀取資源。
這種使用方式看上去更Spring,接着往下看,還有更Spring的騷操作。
2.3使用@Value注解
我們直接使用@Value注解將資源直接注入Spring bean。還有這種操作!不行了!我已經迫不及待的要寫幾行試試了:
完美無暇!斷言全部正確!不知道能不能讀取圖片。我想也是可以的,這個留給你自己發掘。但是就這么結束了嗎?玩一個刺激點的。為什么不直接解析出來並注入對象呢?SpEL(Spring Expression Language)可以做到這一點。讓我們來見識一下吧。
2.4 使用SpEL直接解析
為了展現靈活性,這里我們定義自己的解析類。我們定義了一個讀取配置文件的工具類 cn.felord.mapstruct.util.ResourceReader
兩個方法都是一樣的效果,但是要展現的是不同途徑。下面的代碼必須讓它的出場與眾不同:
被注釋掉的代碼同樣管用,你很容易觀察到它們之間的差別。
3,總結
經過上面的講解,我們了解了Spring去處理資源文件的各種姿勢。而且還有直接獲取並裝配資源的方法。相信看了本文之后你會立即拋掉以前的老套做法。
多多關注我的公眾號,有問題可以留言私信