リソースインタフェース

转】【https://blog.csdn.net/hbtj_1216/article/details/85487787

参考:公式文書

1はじめに

Java標準ライブラリjava.net.URLのクラスと処理低レベルのリソースのための標準的なプロセッサは、優れた機能を提供していません。例えば、それは提供していないURL実装があることができるclasspathServletContextのようなリソースをお読みください。したがって、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インターフェイスの継承は、InputStreamSourceCNOOCに非常に重要な方法をされたインタフェース:

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:、ファイルシステムへのアクセスを示しURLhttp:で示されるhttpアクセスプロトコル; ftp:で表されるftpアクセスプロトコル。

ClassPathResource

ClassPathResource以下からの表現classpathのリソースを取得します。

FileSystemResource

FileSystemResourceそれはあるjava.io.Filejava.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

あなたが本当に絶対パスが必要な場合は、我々は、使用しようとすべきUrlResourcefile:プレフィックスを指定します:

// 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"); 

 

おすすめ

転載: www.cnblogs.com/exmyth/p/11306759.html