2013-10-24 15 views
13

Vì Tomcat có thể tải nhiều hơn một ứng dụng web cùng một lúc và các ứng dụng web đó có thể hoạt động riêng biệt và không làm phiền lẫn nhau, đồng thời chúng hoạt động trong cùng một JVM. Vì vậy, tôi rất bối rối về cách tomcat xử lý Phạm vi đối tượng trong cùng một JVM.Chỉ cần Làm thế nào Tomcat Classloader tách biệt phạm vi đối tượng Webapps khác nhau trong cùng một JVM?

Ví dụ tôi có một đối tượng đơn trong cả hai ứng dụng Web khác nhau và tomcat sẽ tạo hai đối tượng đơn lẻ khác nhau cho mỗi đối tượng. Tôi luôn luôn nghĩ rằng đối tượng singleton chỉ có một đối tượng trong cùng một JVM, nhưng trong JVM tomcat có thể có hai hoặc nhiều hơn.


Tôi đã đọc một số thông tin về ClassLoader, Tomcat có WebAppClassLoader riêng để tải ứng dụng web. Vì vậy, nó có nghĩa là phạm vi đối tượng ở đây là ClassLoader hoặc tôi sai. Có ai biết về điều này hoặc có thể cho tôi một số thông tin về bố trí bộ nhớ tomcat làm việc?

Trả lời

21

Tất cả các bí mật nằm sau các phiên bản ClassLoader đó. Trạng thái của lớp (giống như tất cả các biến tĩnh, mã byte và vv) được scoped bởi trình nạp lớp tải lớp đó (lớp được nhận dạng bởi tên của nó và trình nạp lớp đang nạp lớp này. Đây không phải là lớp chính xác phạm vi, nhưng suy nghĩ như phạm vi thường giúp hiểu điều này tốt hơn). Vì vậy, nếu một lớp được nạp bởi hai trình nạp lớp khác nhau, lớp này tồn tại hai lần trong VM, nó có hai bộ trường tĩnh, có thể có mã byte khác nhau (như triển khai phương thức khác nhau) và tất cả. Các ứng dụng Java "bình thường" có tất cả các lớp được nạp bởi một hệ thống phân cấp trình nạp lớp và mỗi lớp chỉ được nạp một lần.

Đối với các tình huống phức tạp hơn, bạn sẽ cần hành vi khác. Đôi khi bạn muốn tách biệt một thư viện khỏi làm rối tung mã của bạn (như các plugin trong nhật thực hoặc các ứng dụng web trong một máy chủ ứng dụng).

Ý tưởng cơ bản để tách biệt chương trình của bạn khỏi các lớp khác là tải những chương trình có trình nạp lớp bổ sung và sử dụng nhiều phản ánh. Nếu bạn muốn đọc về điều này, hãy xem tài liệu của Oracle theo số ClassLoaders hoặc OSGI.

Tomcat (và nhiều máy chủ web/máy chủ ứng dụng web khác) tải ứng dụng có phân cấp Lớp nạp riêng biệt. Điều này cô lập tất cả các lớp đối với các ứng dụng (web) khác và do đó cũng đảm bảo rằng các phiên bản đơn, các phiên bản lớp khác nhau và tất cả các công cụ này không xung đột.

4

Một điều luôn bị bỏ quên khi nói về những người độc thân, là một singleton chỉ có thể có một ví dụ cho mỗi bộ nạp lớp. Một ClassLoader giới hạn khả năng hiển thị lớp, vì vậy cùng một lớp có thể tồn tại dưới một số trình nạp lớp khác nhau trong cùng một máy ảo. Điều này cho phép bạn, trong số những thứ khác, để có phiên bản khác nhau của lọ nạp cùng một lúc.

Câu hỏi này: Java Class Loaders dường như có một số liên kết và tài nguyên thú vị để tiếp tục nghiên cứu.

2

"ID" của một lớp trong JVM bao gồm tên lớp đầy đủ và trình tải lớp được sử dụng để tải nó. Điều này có nghĩa, nếu bạn nạp hai lớp có cùng tên bởi các trình nạp lớp khác nhau thì chúng được coi là các lớp khác nhau.

6

Hãy nhớ rằng một lớp trong Java được xác định bằng tên đầy đủ của nó là trình nạp lớp đã tải nó. Tomcat sử dụng các trình nạp lớp riêng biệt cho mỗi ngữ cảnh (ứng dụng web) mà bạn triển khai, do đó giữ chúng riêng biệt. Ngoài ra, trình nạp lớp hệ thống tải các thư viện cụ thể tomcat và bộ tải khởi động JVM tải các thư viện lõi Java.

0

Vì vậy, một singleton sẽ là singleton cho trình nạp lớp - trong một vùng chứa/JVM; dưới dạng vùng chứa/JVM có thể có nhiều trình nạp lớp.

2

Trong các ứng dụng Java bình thường khi một trình nạp lớp được yêu cầu tải một lớp, nó sẽ yêu cầu nó tải lớp cha và sau đó tải nó nếu trình nạp lớp cha không thể tìm thấy lớp được yêu cầu.

Đối với các máy chủ ứng dụng web, điều này hơi khác. Thường có trình nạp lớp khác nhau cho mỗi ứng dụng web được triển khai trong một máy chủ ứng dụng web như tomcat. Đối với Tomcat nó trông giống như dưới đây -

enter image description here

Vì vậy, cho các ứng dụng web nguồn lớp tải xảy ra theo thứ tự sau đây -

  1. lớp Bootstrap của JVM (lớp java Core) của bạn
  2. /WEB- INF/các lớp ứng dụng web của bạn
  3. /WEB-INF/lib/*.jar ứng dụng web của bạn
  4. Lớp trình nạp lớp hệ thống (Tomcat/Classpath specif lớp ic)
  5. lớp lớp Common loader (lớp chung cho tất cả các ứng dụng web)

Nhưng lưu ý nếu lớp ứng dụng web nạp được cấu hình với delegate="true" sau đó theo thứ tự được thay đổi -

  1. lớp Bootstrap của bạn JVM (Lớp Java cốt lõi)
  2. Lớp trình nạp lớp hệ thống (Tomcat/Classpath class cụ thể)
  3. Lớp trình nạp lớp phổ biến (các lớp chung cho tất cả các ứng dụng web)
  4. /WEB-INF/classes của ứng dụng web của bạn
  5. /WEB-INF/lib/*.jar của ứng dụng web của bạn

Để biết thêm chi tiết bạn có thể kiểm tra trang Class Loader HOW-TO Apache Tomcat.

0
  1. Ứng dụng khác nhau trong tomcat sử dụng trình nạp lớp khác nhau để tách riêng. Ví dụ app1 sử dụng ClassLoaderA, app2 sử dụng classloaderB.
  2. Mỗi lớp sẽ sử dụng trình nạp lớp của riêng nó để tải các lớp khác. Vì vậy, nếu ClassA.class tham chiếu ClassB.class thì ClassB cần phải nằm trên classpath của classloader của ClassA, hoặc cha mẹ của nó. Ví dụ: Trong app1, com.exmaple.test1 được tải từ ClassLoaderA. Và com.exmaple.test1 muốn new com.exmaple.test2(). Theo mặc định Nó sử dụng trình nạp lớp ClassLoaderA của chính nó để tải com.exmaple.test2. Vì vậy, theo quan điểm của com.exmaple.test1 nó chỉ có thể nhìn thấy class classpath của riêng nó (app1/webapp/classes hoặc app1/webapp/lib). Và Trong app2, Nó sẽ thấy một cái nhìn khác.
  3. Tóm lại, hãy tìm hiểu về trình nạp lớp, bạn phải hiểu mô hình ủy quyền. Và tầm nhìn là đứa trẻ có thể nhìn thấy cha mẹ. nhưng cha mẹ không thể nhìn thấy đứa trẻ và anh chị em không thể nhìn thấy anh chị em.Vì vậy, chúng tôi có thể cô lập các ứng dụng khác nhau.
Các vấn đề liên quan