转】【https://blog.csdn.net/hbtj_1216/article/details/85487787
参考:公式文書
1はじめに
Java
標準ライブラリjava.net.URL
のクラスと処理低レベルのリソースのための標準的なプロセッサは、優れた機能を提供していません。例えば、それは提供していないURL
実装があることができるclasspath
かServletContext
のようなリソースをお読みください。したがって、Spring
そのような提供Resource
のインターフェースをより容易にリソースを読み取ることができます。
2リソースインタフェース
Spring
提供しResource
、インターフェース、行われたリソースへの最初の低レベルアクセスの要約を使いやすさを提供することができます。
ここにあるorg.springframework.core.io.Resource
インターフェイスの定義は:
public interface Resource extends InputStreamSource { /** * 判断资源在物理上是否存在 */ boolean exists(); /** * 表明该资源中的非空内容是否可以通过getInputStream()读取 */ default boolean isReadable() { return exists(); } /** * 表明该资源是否被一个打开的stream处理 */ default boolean isOpen() { return false; } /** * 判断该资源是否代表文件系统中的一个文件 */ default boolean isFile() { return false; } /** * 返回该资源的URL */ URL getURL() throws IOException; /** * 返回该资源的URI */ URI getURI() throws IOException; /** * 返回该资源对应的File */ File getFile() throws IOException; /** * 返回一个ReadableByteChannel(可读的字节流通道) */ default ReadableByteChannel readableChannel() throws IOException { return Channels.newChannel(getInputStream()); } /** * 返回资源中内容的长度 */ long contentLength() throws IOException; /** * 返回该资源的最后修改时间 */ long lastModified() throws IOException; /** * 创建一个和该资源相关的资源 */ Resource createRelative(String relativePath) throws IOException; /** * 返回文件名 */ @Nullable String getFilename(); /** * 返回资源的描述 */ String getDescription(); }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
Resource
インターフェイスの継承は、InputStreamSource
CNOOCに非常に重要な方法をされたインタフェース:
public interface InputStreamSource {
/** * 找到并打开资源,返回读取资源内容的InputStream. 每次调用返回一个新的InputStream. */ InputStream getInputStream() throws IOException; }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
リソース・インタフェース構築された3春の実装クラス
Spring
これは、次のいくつか含まれているResource
インタフェースの実装クラスを:
- UrlResource:からの
URL
資源へのアクセス。 - ClassPathResource:からの
classpath
資源へのアクセス。 - FileSystemResource:ファイルシステムからリソースへのアクセス。
- ServletContextResource:から
servlet
リソースコンテキストへのアクセス。 - InputStreamResource:からの
InputStream
資源へのアクセス。 - ByteArrayResource:バイト配列からのリソースへのアクセス。
UrlResource
UrlResource
あるjava.net.URL
アクセスによって任意の使用可能なパッケージURL
、ファイル、などのリソースのオブジェクトアクセス、HTTP
ターゲットオブジェクト、FTP
ターゲットオブジェクトなどが。
各タイプはURL
、リソースの種類を表す接頭辞を持っています。例えばfile:
、ファイルシステムへのアクセスを示しURL
、http:
で示されるhttp
アクセスプロトコル; ftp:
で表されるftp
アクセスプロトコル。
ClassPathResource
ClassPathResource
以下からの表現classpath
のリソースを取得します。
FileSystemResource
FileSystemResource
それはあるjava.io.File
とjava.nio.file.Path
、ファイルの代わりにパッケージは、ファイルシステムから読み込まれます。
ServletContextResource
ServletContextResource
あなたの便宜のためServletContext
にする相対からデザインのリソースへのアクセス、web
リソースのアプリケーションのルートディレクトリを取得します。
InputStreamResource
InputStreamResource
それは、与えられたから使用されているInputStream
内のリソースへのアクセス。
ByteArrayResource
ByteArrayResource
指定されたバイト配列からのリソースへのアクセスのために、それが作成されますByteArrayInputStream
。
4 ResourceLoader
ResourceLoader
インターフェイスは、リソースをロードするために使用され、それが提供getResource
返す関数Resource
オブジェクト。ここではその定義は次のとおりです。
public interface ResourceLoader {
String CLASSPATH_URL_PREFIX = ResourceUtils.CLASSPATH_URL_PREFIX; Resource getResource(String location); @Nullable ClassLoader getClassLoader(); }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
すべてのアプリケーション・コンテキストを実装ResourceLoader
しますが、コンテキストからアプリケーションを得ることができるので、インターフェースをResource
オブジェクト:
Resource template = ctx.getResource("some/resource/path/myTemplate.txt");
- 1
あなたが呼び出す場合getResource()
、指定されたリソースのパスに接頭辞なしで、時間をSpring
に基づいて、context
リソースオブジェクトの適切な型を返すのタイプ。たとえば、ClassPathXmlApplicationContext
オブジェクトを呼び出すgetResource()
返す関数ClassPathResource
オブジェクトを。
あなたは接頭辞を指定した場合は、関係なくcontext
どのようなタイプ、のような、対応するリソースタイプのプレフィックスを返しません。
Resource template = ctx.getResource("classpath:some/resource/path/myTemplate.txt");
- 1
次の表は、パスに対応するリソースのリソースタイプを要約したものです。
接頭辞 | 例 | 説明 |
---|---|---|
クラスパス: | classpath:com/myapp/config.xml |
以下からclasspath のリソースのロード。 |
ファイル: | file:///data/config.xml |
ファイルシステムからリソースをロードします。 |
http: | http://myserver/logo.png |
使用するhttp リソースをロードするためのプロトコルを。 |
(無し) | /data/config.xml |
context 種別判定。 |
5 ResourceLoaderAwareインタフェース
ResourceLoaderAware
それはSpring
、注射のために提供するコールバックインタフェースResourceLoader
:
public interface ResourceLoaderAware extends Aware { void setResourceLoader(ResourceLoader resourceLoader); }
- 1
- 2
- 3
- 4
クラスが実装している場合ResourceLoaderAware
インターフェイスおよびSpring
コンテキストとして登録されbean
、それは、context
そのコールするsetResourceLoader()
方法があろうcontext
(すべてため行く自体を設定context
実装されるResourceLoader
インターフェイス)。
次に例を示します。
@Component
public class ResourceBean implements ResourceLoaderAware { private ResourceLoader resourceLoader; @Override public void setResourceLoader(ResourceLoader resourceLoader) { this.resourceLoader = resourceLoader; } public ResourceLoader getResourceLoader() { return resourceLoader; } }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
@Test
public void test() { ApplicationContext ctx = new ClassPathXmlApplicationContext("test/resourceLoaderAware.xml"); ResourceBean resourceBean = ctx.getBean(ResourceBean.class); ResourceLoader loader = resourceBean.getResourceLoader(); Assert.assertTrue(loader instanceof ApplicationContext); }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
上記を達成する方法
ResourceLoaderAware
の実施形態の注入インターフェースをResourceLoader
、侵襲的な方法が属します。Spring 2.5
その後、直接によって@Autowired
自動的に注入モードの注入ResourceLoader
。
6アプリケーション・コンテキストおよびリソース・パス
6.1アプリケーションコンテキストを構築します
文字列または文字列の配列に一般アプリケーションコンテキストコンストラクタリソース往路。何のパス接頭辞が存在しない場合には、リソースの種類は、建物のコンテキストの種類によって異なります。
以下の例は、リソースへのパスで構成されているClassPathXmlApplicationContext
コンテキスト・オブジェクト:
ApplicationContext ctx = new ClassPathXmlApplicationContext("conf/appContext.xml");
- 1
以下の実施例は、パスのリソース構成に基づいて、FileSystemXmlApplicationContext
コンテキスト・オブジェクト:
ApplicationContext ctx = new FileSystemXmlApplicationContext("conf/appContext.xml");
- 1
また、特定のパス接頭辞を使用して、リソースの種類を指定することができます。
6.2には、ワイルドカードリソースパスをサポートしています
することができ*
、リソースファイルの数を表します。
/WEB-INF/*-context.xml
com/mycompany/**/applicationContext.xml
file:C:/some/path/*-context.xml
classpath:com/mycompany/**/applicationContext.xml
- 1
- 2
- 3
- 4
6.3クラスパス*:和のクラスパス:
classpath*:
そして、classpath:
主な違いは、に反映されます。
classpath:
:現在のプロジェクトでのみWEB-INF/classes
ファイルパスを検索します。classpath*:
:だけでなく、現在の羨望のWEB-INF/classes
パスの下に、だけでなく、サードパーティ製のファイル検索jar
ファイルは、WEB-INF/classes
ファイルを検索します。
6.4 FileSystemResourceルーティング問題
互換性のために、FileSystemXmlApplicationContext
相対的および絶対パスは、現在の作業ディレクトリプロジェクトに対して、相対パスを考えます。
以下の二つは等価です。
ApplicationContext ctx = new FileSystemXmlApplicationContext("conf/context.xml");
- 1
ApplicationContext ctx = new FileSystemXmlApplicationContext("/conf/context.xml");
- 1
あなたが本当に絶対パスが必要な場合は、我々は、使用しようとすべきUrlResource
でfile:
プレフィックスを指定します:
// actual context type doesn't matter, the Resource will always be UrlResource
ctx.getResource("file:///some/resource/path/myTemplate.txt");
- 1
- 2
// force this FileSystemXmlApplicationContext to load its definition via a UrlResource
ApplicationContext ctx = new FileSystemXmlApplicationContext("file:///conf/context.xml");