spring mvc 웹. xml 에서 Spring 의 설정 파일 및 resource 를 자동 으로 검색 할 때 classpath *: classpath 와 의 차이
우선 웹. xml 에 감청 기 listener 를 설정 하여 spring 을 자동 으로 가 져 옵 니 다.구체 적 으로 가입 한 코드 는 다음 과 같다.
[html] view plain
copy
서 비 스 를 시작 하면 이 설정 은 기본적으로 프로필 을 불 러 옵 니 다. 안에 있 는 bean 을 자동 으로 초기 화 합 니 다.기본적으로 / WEB - INF / applicationContext. xml 파일 로 갑 니 다.설정 파일 을 classpath, 즉 src 디 렉 터 리 에 두 려 면 경 로 를 지정 해 야 합 니 다. 구체 적 인 코드 는 다음 과 같 습 니 다.
[html] view plain
copy
context-param>
이렇게 되면 서버 가 시 작 될 때 자동 으로 classpa, 즉 src 디 렉 터 리 에서 모든 것 을 찾 습 니 다: applicationContext - *. xml 파일 을 초기 화 합 니 다.
Spring 에서 resource 를 불 러 올 때 classpath *: classpath 와 의 차이
Spring 은 classpath *: classpath: 접두사 와 경 로 를 추가 하 는 방식 으로 classpath 에서 파일 을 불 러 올 수 있 습 니 다. 예 를 들 어 bean 의 정의 파일 인 classspath *: 여러 jar 파일 에서 같은 파일 을 불 러 오기 위 한 것 입 니 다. classspath: 찾 은 첫 번 째 파일 만 불 러 올 수 있 습 니 다.
예 를 들 어 resource 1. jar 의 package 'com. test. rs' 는' jarAppcontext. xml '파일 이 있 는데 내용 은 다음 과 같 습 니 다.
resource2. jar 의 package 'com. test. rs' 에 도' jarAppcontext. xml '파일 이 있 습 니 다. 내용 은 다음 과 같 습 니 다.
아래 코드 를 사용 하면 두 개의 jar 가방 에 있 는 파일 을 모두 불 러 올 수 있 습 니 다.
ApplicationContext ctx = new ClassPathXmlApplicationContext( "classpath*:com/test/rs/jarAppcontext.xml");
다음 코드 로 쓰 면 xml 파일 하나만 찾 을 수 있 습 니 다. (순 서 는 jar 패키지 의 로드 순서 에 달 려 있 습 니 다)
ApplicationContext ctx = new ClassPathXmlApplicationContext( "classpath:com/test/rs/jarAppcontext.xml");
classpath *: 여러 개의 component (최종 적 으로 다른 jar 패키지 로 발표) 를 병행 개발 하기 위해 사용 되 며, 각각의 bean 정의 파일 은 일정한 규칙 에 따라 패키지 + filename 입 니 다. 이 component 를 사용 하 는 호출 자 는 이 파일 을 모두 불 러 올 수 있 습 니 다.
classpath *: 로 딩 은 classloader 를 사 용 했 습 니 다.
getResources()
방법 은 서로 다른 J2EE 서버 에서 실행 된다 면 응용 서버 가 자신의 classloader 를 제공 하기 때문에 jar 파일 을 처리 할 때 행동 이 다 를 수 있 습 니 다.테스트 하려 면 classpath*:
유효한 지 여 부 는 classloader 로 classpath 의 jar 파일 에서 파일 을 불 러 와 서 테스트 할 수 있 습 니 다: getClass().getClassLoader().getResources("")
.(위의 예 는 sun 의 jre 에서 실행 되 는 상태 입 니 다)Spring 의 원본 코드 에서 PathMatchingResourcePattern Resolver 류 에서 우 리 는 그 에 대한 처 리 를 더욱 잘 알 수 있 습 니 다. classpath * 로 시작 하면 classpath 를 옮 겨 다 닐 것 입 니 다.
[java] view plain
copy
protected Resource[] findAllClassPathResources(String location) throws IOException {
String path = location;
if (path.startsWith("/")) {
path = path.substring(1);
}
Enumeration resourceUrls = getClassLoader().getResources(path);
Set result = new LinkedHashSet(16);
while (resourceUrls.hasMoreElements()) {
URL url = (URL) resourceUrls.nextElement();
result.add(convertClassLoaderURL(url));
}
return result.toArray(new Resource[result.size()]);
}
http://blog.csdn.net/kkdelta/article/details/5560210, JAVA 에서 classpath 를 옮 겨 다 니 며 찾 은 이름 에 맞 는 모든 파일 을 소개 합 니 다.
또한 resource 를 불 러 올 때 다른 접두사 의 미 는 다음 표 와 같 습 니 다. classpath * 는 지정 한 프로필 의 경로 와 만 사용 할 수 있 습 니 다. getResource 에 사용 할 수 있 는 인자 에 사용 할 수 없습니다. 예 를 들 어 appContext. getResource ("classpath *: conf / bfactory Ctx. xml") 는 이상 합 니 다.
접두사
예시
설명 하 다.
classpath:
classpath:com/myapp/config.xml
classpath 에서 불 러 옵 니 다.
file:
file:/data/config.xml
... 로 삼다
URL
파일 시스템 에서 불 러 옵 니 다.http:
http://myserver/logo.png
... 로 삼다
URL
로드(none)
/data/config.xml
근거
ApplicationContext
판단 을 내리다.Spring 의 원본 코드 에서 이 유 를 알 수 있 습 니 다. classpath: 시작 할 때 classpath 에서 불 러 옵 니 다. 그렇지 않 으 면 URL 을 시도 합 니 다. 실패 하면 getResource ByPath 를 호출 합 니 다.
[java] view plain
copy
public Resource getResource(String location) {
Assert.notNull(location, "Location must not be null");
if (location.startsWith(CLASSPATH_URL_PREFIX)) {
return new ClassPathResource(location.substring(CLASSPATH_URL_PREFIX.length()), getClassLoader());
}
else {
try {
// Try to parse the location as a URL...
URL url = new URL(location);
return new UrlResource(url);
}
catch (MalformedURLException ex) {
// No URL -> resolve as resource path.
return getResourceByPath(location);
}
}
}
getResource. ByPath 는 달라 집 니 다.
ApplicationContext
덮어 쓰기 실현.
Generic WebApplication Context 는 다음 과 같이 덮어 씁 니 다.
[java] view plain
copy
protected Resource getResourceByPath(String path) {
return new ServletContextResource(this.servletContext, path);
}
... 와 같다 FileSystem XmlApplication Context 는 다음 과 같이 덮어 씁 니 다.
protected Resource getResourceByPath(String path) {
if (path != null && path.startsWith("/")) {
path = path.substring(1);
}
return new FileSystemResource(path);
}
마지막 으로 파일 을 불 러 올 때 도 JAVA 에서 흔히 볼 수 있 는 파일 을 읽 는 방법 입 니 다.
예 를 들 어 ClassPathResource 가 input stream 을 얻 는 방법 은 class loader 를 이용 하 는 것 입 니 다.
[java] view plain
copy
public InputStream getInputStream() throws IOException {
InputStream is;
if (this.clazz != null) {
is = this.clazz.getResourceAsStream(this.path);
}
예 를 들 어 FileSystem Resource 가 input stream 을 얻 는 방법 은 FileInput Stream 을 이용 하 는 것 입 니 다.
public InputStream getInputStream() throws IOException { return new FileInputStream(this.file); }
예 를 들 어 ServletContextResource 가 input stream 을 얻 는 방법 은 servletContext. getResource AsStream 을 이용 하 는 것 이다.
[java] view plain
copy
public InputStream getInputStream() throws IOException {
InputStream is = this.servletContext.getResourceAsStream(this.path);
if (is == null) {
throw new FileNotFoundException("Could not open " + getDescription());
}
return is;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Pytest 테스트 프레임워크 기본 사용 방법 상세 정보pytest 소개 2. 매개 변수화를 지원하여 테스트할 테스트 용례를 세밀하게 제어할 수 있다. 3. 간단한 단원 테스트와 복잡한 기능 테스트를 지원할 수 있고selenium/appnium 등 자동화 테스트, 인터페...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.