Sự khác biệt tiền tố classpath mùa xuân


141

Tài liệu ở đây ghi rõ

Tiền tố đặc biệt này xác định rằng tất cả các tài nguyên đường dẫn khớp với tên đã cho phải được lấy (bên trong, điều này về cơ bản xảy ra thông qua lệnh gọi ClassLoader.getResource (...)), sau đó được hợp nhất để tạo thành định nghĩa ngữ cảnh ứng dụng cuối cùng.

Ai đó có thể giải thích điều này?

Sự khác biệt giữa việc sử dụng classpath*:conf/appContext.xmltrái ngược với classpath:conf/appContext.xmlkhông có dấu hoa thị là gì.


Độc giả tương lai, cũng thấy lỗi này, với "status = bị từ chối". github.com/spring-projects/spring-framework/issues/16017 Chỉ trong trường hợp URL cuối cùng không thành công, tiêu đề của bài đăng lỗi là "Nhập tệp XML từ thư mục gốc của tệp JAR với đường dẫn ký tự đại diện và ký tự đại diện không hoạt động [
XUÂN

Câu trả lời:


207

ĐỊNH NGH SIMA ĐƠN GIẢN

Điều này classpath*:conf/appContext.xmlđơn giản có nghĩa là tất cả các tệp appContext.xml trong confcác thư mục trong tất cả các tệp của bạn trên đường dẫn lớp sẽ được chọn và tham gia vào một ngữ cảnh ứng dụng lớn.

Ngược lại, classpath:conf/appContext.xmlsẽ chỉ tải một tệp như vậy ... tệp đầu tiên được tìm thấy trên đường dẫn lớp của bạn.


6
có một sự khác biệt thú vị hơn giữa chúng. Xem câu hỏi của tôi cũng: stackoverflow.com/questions/16985770/...
Eugene

27
Một điều rất quan trọng - nếu bạn sử dụng * và Spring không tìm thấy kết quả trùng khớp, nó sẽ không phàn nàn. Nếu bạn không sử dụng * và không có kết quả trùng khớp, bối cảnh sẽ không bắt đầu (!)
Roy Truelove

39

Các classpath*:...cú pháp rất hữu ích chủ yếu khi bạn muốn xây dựng một bối cảnh ứng dụng từ nhiều file định nghĩa bean, sử dụng cú pháp wildcard.

Ví dụ: nếu bạn xây dựng bối cảnh của mình bằng cách sử dụng classpath*:appContext.xml, đường dẫn lớp sẽ được quét cho mọi tài nguyên được gọi appContext.xmltrong đường dẫn lớp và các định nghĩa bean từ tất cả chúng được hợp nhất vào một ngữ cảnh.

Ngược lại, classpath:conf/appContext.xmlsẽ có được một và chỉ một tệp được gọi appContext.xmltừ đường dẫn lớp. Nếu có nhiều hơn một, những người khác sẽ bị bỏ qua.


2
Classpath * cũng sẽ tìm trong thư mục con? Nói cách khác, nếu tôi có appContext.xml trong thư mục gốc classpath và một trong /dir/appContext.xml, nó sẽ tải cả khi tôi sử dụng classpath *: appContext.xml?
AHungerArtist

21

classpath *: Nó đề cập đến một danh sách các tài nguyêntải tất cả các tệp như vậy trong classpath và danh sách có thể trống và nếu không có tệp nào như vậy trong classpath thì ứng dụng sẽ không đưa ra bất kỳ ngoại lệ nào (chỉ cần bỏ qua lỗi).

classpath: Nó đề cập đến một tài nguyên nhất địnhchỉ tải tệp đầu tiên được tìm thấy trên đường dẫn lớp và nếu không có tệp nào như vậy xuất hiện trong đường dẫn lớp thì nó sẽ ném ngoại lệ

java.io.FileNotFoundException: class path resource [conf/appContext.xml] cannot be opened because it does not exist

Tài liệu chính thức "Không thể sử dụng tiền tố class *: để xây dựng một thực tế Resource, vì một tài nguyên chỉ tới một tài nguyên tại một thời điểm." cộng với tôi vừa gặp phải lỗi kỳ lạ này, đó là cách tôi kết thúc ở đây. Nếu bạn định nhập tài nguyên thì sẽ không có ý nghĩa gì khi sử dụng tiền tố classpath ký tự đại diện.
GabrielOshiro

0

Mã nguồn của Spring:

public Resource[] getResources(String locationPattern) throws IOException {
   Assert.notNull(locationPattern, "Location pattern must not be null");
   //CLASSPATH_ALL_URL_PREFIX="classpath*:"
   if (locationPattern.startsWith(CLASSPATH_ALL_URL_PREFIX)) {
      // a class path resource (multiple resources for same name possible)
      if (getPathMatcher().isPattern(locationPattern.substring(CLASSPATH_ALL_URL_PREFIX.length()))) {
         // a class path resource pattern
         return findPathMatchingResources(locationPattern);
      }
      else {
         // all class path resources with the given name
         return findAllClassPathResources(locationPattern.substring(CLASSPATH_ALL_URL_PREFIX.length()));
      }
   }
   else {
      // Only look for a pattern after a prefix here
      // (to not get fooled by a pattern symbol in a strange prefix).
      int prefixEnd = locationPattern.indexOf(":") + 1;
      if (getPathMatcher().isPattern(locationPattern.substring(prefixEnd))) {
         // a file pattern
         return findPathMatchingResources(locationPattern);
      }
      else {
         // a single resource with the given name
         return new Resource[] {getResourceLoader().getResource(locationPattern)};
      }
   }
}  

Bạn có thể giải thích dùm không?
RtmY
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.