Làm thế nào để đóng một ApplicationContext mùa xuân?


83

Sau khi ứng dụng của tôi hoàn tất, tôi muốn đóng bối cảnh mùa xuân.
Mã liên quan có ApplicationContexttham chiếu nhưng tôi không thể tìm thấy closephương pháp.

Câu trả lời:


149

Downcast của bạn ApplicationContextđến phương thức ConfigurableApplicationContextxác định close():

((ConfigurableApplicationContext)appCtx).close();

13
Bạn cũng có thể truyền tớiAbstractApplicationContext
eeezyy

3
@eeezyy - Vì AbstractApplicationContextlà một lớp và ConfigurableApplicationContextlà một giao diện được triển khai bởi lớp đó, có lẽ tốt hơn là sử dụng cái sau trong hầu hết các trường hợp.
Periata Breatta

3
Như ConfigurableApplicationContextbây giờ mở rộng Closable(không biết phiên bản thay đổi này được thực hiện, nhưng tài liệu cho 4.2.x hiển thị nó trong khi 3.0.x không) một phiên bản ngắn hơn nhiều ((Closable)context).close();.
Periata Breatta

6
Ngoài ra còn có bây giờ là một AutoCloseablethực hiện, có nghĩa là một thử-với-nguồn lực bây giờ có thể được sử dụng, miễn là bạn lưu trữ nội dung của bạn trong một biến nơi AutoCloseablegiao diện có thể nhìn thấy, tức làtry (ConfigurableApplicationContext context = new ....) { /* your code goes here */ } // context is closed when you leave the try block
Periata Breatta

Tôi nên đóng bối cảnh ở đâu? Tôi có một ứng dụng lắng nghe liên tục nhận được tin nhắn thông qua phương thức onMessage () của lớp MessageListener. Tôi nên đóng ngữ cảnh ứng dụng để cuối cùng tắt trình thực thi ở phần nào?
Wax

36

Bạn cần đăng ký một hook tắt với JVM như hình dưới đây:

((AbstractApplicationContext)appCtx).registerShutdownHook();

Để biết thêm thông tin, hãy xem: Hướng dẫn sử dụng Spring: 3.6.1.6 Tắt hộp chứa Spring IoC một cách duyên dáng trong các ứng dụng không phải web


Thật kỳ lạ, điều này không hiệu quả đối với tôi trong một lớp kiểm tra, nhưng sử dụng câu trả lời của Avner Levy ở cuối hàm main () lại hoạt động.
JReader

1
@JReader - các hook tắt máy không đáng tin cậy trong nhiều trường hợp và không được chạy bởi hầu hết các khung thử nghiệm (vì thường máy ảo không thực sự thoát giữa các thử nghiệm đang chạy) hoặc một số khung ứng dụng. (Ví dụ: servlet - bất kỳ thứ gì có thể về cơ bản, chấm dứt và tải lại một ứng dụng mà không kết thúc máy ảo). Bạn có lẽ không nên sử dụng chúng trừ khi bạn biết mình đang làm gì và làm thế nào mã của bạn sẽ được sử dụng ..
Periata Breatta

13

Nếu bạn khởi tạo ngữ cảnh như bên dưới

ApplicationContext context = new ClassPathXmlApplicationContext(beansXML); 

bối cảnh sạch sẽ như thế này

((ClassPathXmlApplicationContext) context).close();

12

Nếu Java SE 7 trở lên , không đóng, hãy sử dụng thử với tài nguyên để đảm bảo rằng mỗi tài nguyên được đóng ở cuối câu lệnh.

try(final AbstractApplicationContext applicationContext = new ClassPathXmlApplicationContext(new String[]{"classpath*:META-INF/spring/*.xml" }))
{
     //write your code
}

1

Các bước để đóng ApplicationContextĐối tượng

  1. Nhập Truyền ApplicationContextđối tượng sang ConfigurableApplicationContextđối tượng.
  2. sau đó gọi đối tượng đóng vào đó.

thí dụ:

 ApplicationContext context = new ClassPathXmlApplicationContext("mybeans.xml");

((ConfigurableApplicationContext)context ).close();

1
public static void main(String[] args) {
    ApplicationContext context=new ClassPathXmlApplicationContext("SpringCnf.xml");
    Resturant rstro1=(Resturant)context.getBean("resturantBean");
    rstro1.setWelcome("hello user");
    rstro1.welcomeNote();
    ((ClassPathXmlApplicationContext) context).close();

1
Khi trả lời một bài đăng cũ, sẽ rất hữu ích nếu bạn có thể cung cấp một số ngữ cảnh cho câu trả lời của mình thay vì chỉ mã, vì nó có thể làm cho nó hữu ích hơn cho người khác.
David Buck
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.