org.springframework.core.io.Resource
특징
추상화 한 이유
실질적으로 내부에서는 모두 리소스를 사용한다.
@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 FileSystemXmlApplicationContext("xxx.xml"); (파일시스템 경로 기준) 을 쓰면 자동으로 내부적으로는 Resource resource = resourceLoader.getResource("xxx.xml"); 으로 변환되는 것이다.
인터페이스 둘러보기
구현체
리소스 읽어오기
확인하는 방법
@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())));
}
}
그러나 스프링 웹 어플리케이션을 작성할 경우 classpath 기준으로 많은 리소스들을 사용하기 때문에 classpath 접두어를 붙이는 것을 추천한다. 아무 접두어를 붙이지 않으면 ServletContextResource로 resolving 된다.
Resource 추상화에 대한 추가적인 내용은 https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#resources-as-dependencies 에서 확인할 수 있다.
참고