spring mvc 웹. xml 에서 Spring 의 설정 파일 및 resource 를 자동 으로 검색 할 때 classpath *: classpath 와 의 차이

6911 단어 프레임spring
원문 전재:http://blog.csdn.net/g_blue_wind/article/details/52043924
우선 웹. xml 에 감청 기 listener 를 설정 하여 spring 을 자동 으로 가 져 옵 니 다.구체 적 으로 가입 한 코드 는 다음 과 같다.
[html]  view plain
 copy
 
 org.springframework.web.context.ContextLoaderListenerlistener-class> listener>  
서 비 스 를 시작 하면 이 설정 은 기본적으로 프로필 을 불 러 옵 니 다. 안에 있 는 bean 을 자동 으로 초기 화 합 니 다.기본적으로 / WEB - INF / applicationContext. xml 파일 로 갑 니 다.설정 파일 을 classpath, 즉 src 디 렉 터 리 에 두 려 면 경 로 를 지정 해 야 합 니 다. 구체 적 인 코드 는 다음 과 같 습 니 다.
[html]  view plain
 copy
 
  
 contextConfigLocationparam-name>  
  
  
classpath:applicationContext-*.xmlparam-value>  
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;  
}  
  • 좋은 웹페이지 즐겨찾기