リソースの抽象化


org.springframework.core.io.Resource
特長
  • java.net.URL抽象化.
  • スプリング内部でよく使用されるインタフェース.
  • 抽象化の原因
  • クラスパスでリソースを検索する機能がない
  • .
  • サーブレットContextから相対パス
  • を取得できません.
  • の新しいHandlerを登録して、特別なURL接尾辞を作成することができますが、複雑で便利さに欠けています.
  • 実質的に、内部は資源を使用しています.
    @Component
    public class AppRunner implements ApplicationRunner {
        /*
        @Autowired
        ApplicationContext resourceLoader;
        */
    
        @Autowired
        ResourceLoader resourceLoader;
        
         @Override
        public void run(ApplicationArguments args) throws Exception {
            var ctx = new ClassPathXmlApplicationContext("abc.xml");
            System.out.println(resourceLoader.getClass());
            Resource resource = resourceLoader.getResource("test.txt");
            //Resource resource = resourceLoader.getResource("classpath:test.txt");
            System.out.println(resource.getClass());
            System.out.println(resource.exists()); System.out.println(Files.readString(Path.of(resource.getURI())));
        }
    }
    var ctx = new ClassPathXmlApplicationContext("xxx.xml"); (クラスパスベース)またはvar ctx=new F i l e SystemXmlApplicationContext(「xxx.xml」)(ファイルシステムパスベース)内部に自動的にResourceResourceResource=ResourceLoaderが書き込まれます.getResource("xxx.xml"); に変換します.
    インタフェースの参照
  • 継承インタフェース
  • 主な方法
    - getInputStream()
    - exitst()
    - isOpen()
    -getDescription():フルパスを含むファイル名または実際のURL
  • インプリメンテーションボディ
  • UrlResource: java.net.URL、デフォルトでサポートされているプロトコルhttp、http、ftp、file、jarを参照してください.
  • ClassPathResource:サポートされているプレフィックスクラスパス:
  • FileSystemResource
  • サーブレットContextResource:Webアプリケーションのルートディレクトリの相対パスでリソースを検索します.(実際、最もよく使われる理由は以下の通りです)
  • ...
  • リソースの取得
  • Resourceのタイプは、locaion文字列およびApplicationContextのタイプに依存します.(ResourceLoaderもApplicationContextで実施)
    - ClassPathXmlApplicationContext -> ClassPathResource
    - FileSystemXmlApplicationContext -> FileSystemResource
    - WebApplicationContext -> ServletContextResource
  • アプリケーションコンテキストのタイプを考慮せずにリソースタイプを強制するにはjavaを使用します.net.URL接頭辞(+classpath:)のいずれかを使用できます.
    - classpath:me/whiteship/config.xml -> ClassPathResource
    - file:///some/resource/path/config.xml -> FileSystemResource
  • 検証方法
    
    @Component
    public class AppRunner implements ApplicationRunner {
        
        @Autowired
        ApplicationContext resourceLoader;
    
        /*
        @Autowired
        ResourceLoader resourceLoader;
        */
    
        @Override
        public void run(ApplicationArguments args) throws Exception {
            System.out.println(resourceLoader.getClass());
            Resource resource = resourceLoader.getResource("classpath:test.txt");
            System.out.println(resource.getClass());
            System.out.println(resource.exists());
            System.out.println(resource.getDescription());
            System.out.println();
            System.out.println(Files.readString(Path.of(resource.getURI())));
        }
    }
    ただし、Spring Webアプリケーションを作成する際には、classpath規格として多くのリソースが使用されているため、classpath接頭辞の使用を推奨します.接頭辞がない場合は、サーブレットContextResourceとして解析されます.
    Resource抽象に関する他のコンテンツは、https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#resources-as-dependenciesにあります.
    リファレンス
  • インフラストラクチャ:スプリングフレームキーテクノロジー(白旗線)
  • https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/core/io/Resource.html
  • https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#resources-as-dependencies