2013-02-23 28 views
14

Tôi mới vào khung công tác xuân, bắt đầu với một số hướng dẫn để tìm hiểu nó.Phương pháp tiêu diệt hạt đậu mùa xuân, singleton và nguyên mẫu

tôi có các file sau,

# MainProgram.java

package test.spring; 
import org.springframework.context.support.AbstractApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 

public class MainProgram { 
     public static void main(String[] args) { 
       AbstractApplicationContext context = 
           new ClassPathXmlApplicationContext("Bean.xml");  
       HelloSpring obj = (HelloSpring) context.getBean("helloSpring"); 
       obj.setMessage("My message"); 
       obj.getMessage(); 
       context.registerShutdownHook(); 

     } 
} 

# HelloSpring.java

package test.spring; 

public class HelloSpring { 
    private String message; 

    public void setMessage(String message){ 
     this.message = message; 
     System.out.println("Inside setMessage"); 
    } 

    public void getMessage(){ 
     System.out.println("Your Message : " + this.message); 
    } 

    public void xmlInit() { 
    System.out.println("xml configured initialize"); 
    } 

    public void xmlDestroy() { 
    System.out.println("xml configured destroy"); 
    } 

    } 

# Bean.xml

<?xml version="1.0" encoding="UTF-8"?> 
    <beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> 

    <bean id="helloSpring" class="test.spring.HelloSpring" 
      scope="prototype" init-method="xmlInit" destroy-method="xmlDestroy"> 

    </bean> 
    </beans> 

Khi tôi mất scope="singleton" của tôi đầu ra là:

xml configured initialize 
Inside setMessage 
Your Message : My message 
xml configured destroy 

Khi tôi mất scope="prototype" đầu ra của tôi là:

xml configured initialize 
Inside setMessage 
Your Message : My message 

xmlDestroy() phương pháp được gọi với đậu singleton phạm vi nhưng không phải với prototype vui lòng giúp tôi cho sau này,

Is Điều này đúng? nếu có, lý do có thể là gì?

Ngoài ra tôi có một số thắc mắc như thế nào,

chênh lệch hoặc mối quan hệ là gì giữa ApplicationContext , AbstractApplicationContext and ClassPathXmlApplicationContext

Trả lời

34

xmlDestroy() phương pháp được gọi với đậu phạm vi singleton nhưng không phải với nguyên mẫu vì

mùa xuân không quản lý vòng đời hoàn chỉnh của một bean nguyên mẫu: các instantiates container, cấu hình, trang trí và nếu không tập hợp một đối tượng nguyên mẫu, tay nó để khách hàng và sau đó không có kiến ​​thức thêm về ví dụ nguyên mẫu đó. Để giải phóng tài nguyên, hãy thử triển khai trình xử lý bài đăng bean tùy chỉnh.

Không giống như đậu singleton nơi chứa lò xo quản lý hoàn toàn vòng đời

Bạn có thể có một cái nhìn tại cơ bản tutorial này cho sự khác biệt giữa hoàn cảnh khác nhau

Tham khảo documentation

+0

Để phát hành tài nguyên, DestructionAwareBeanPostProcessor có thể được triển khai thay vì một BeanPostProcessor thông thường. –

1

Đây là hành vi dự kiến. Không có cách nào để Spring biết khi bạn đã hoàn thành bằng cách sử dụng một bean phạm vi nguyên mẫu, do đó, sự hủy diệt bean không được Spring quản lý cho các bean có phạm vi nguyên mẫu. Từ các tài liệu:

Mặc dù phương pháp khởi tạo vòng đời callback được gọi là trên tất cả các đối tượng bất kể phạm vi, trong trường hợp của nguyên mẫu, cấu hình callbacks phá hủy vòng đời không được gọi.

Xem Spring documentation để biết thêm thông tin.

Liên quan đến ApplicationContext s, bạn có thể chọn loại phù hợp nhất với ứng dụng của mình. Nó phụ thuộc vào việc bạn muốn sử dụng cấu hình bean XML hay chú thích, và có hay không bạn đang chạy trong một thùng chứa servlet chẳng hạn. ApplicationContext chính nó là giao diện ở gốc của kiểu heirarchy.

2

Một bean singleton có nghĩa là có chính xác một thể hiện của bean đó trong ngữ cảnh ứng dụng. Điều đó có nghĩa là nếu bạn làm điều gì đó như thế này:

HelloSpring obj = (HelloSpring) context.getBean("helloSpring"); 
    obj.setMessage("My message"); 
    System.out.printIn(obj.getMessage()); 
    HelloSpring anotherObj = (HelloSpring) context.getBean("helloSpring"); 
    System.out.printIn(anotherObj.getMessage()); 

Bạn sẽ thấy "Thông báo của tôi" trong đầu ra bàn điều khiển hai lần.

Đối với mẫu thử nghiệm mỗi khi bạn cố gắng lấy một trong những mẫu từ ngữ cảnh ứng dụng, bạn sẽ nhận được một phiên bản mới, vì vậy nếu bạn chạy mã trên, đầu ra bàn điều khiển thứ hai sẽ là "null".

Vì không cần hộp chứa để gọi phương thức tiêu diệt cho hạt đậu nguyên mẫu, nó không và hành vi là chính xác.

Sự khác biệt giữa các lớp nói trên là giao diện, lớp trừu tượng và lớp bê tông tương ứng, để hiểu rõ hơn về các khái niệm đó, tôi khuyên bạn nên đọc tài liệu oracle chính thức cho java tại đây Oracle Java Tutorials.

-1

Vui lòng kiểm tra loại phạm vi của bạn trong tệp cấu hình mùa xuân. Nếu phạm vi = "nguyên mẫu", sau đó thay đổi nó để phạm vi = "singleton"

<bean id="helloWorld" class="com.example.test.HelloWorld" 
init-method="init" destroy-method="destroy"> 
<property name="message" value="Hello World!" /> 

0

Tôi cũng đã cố gắng để có được một sự kiện hủy diệt của đậu mà là phạm vi là "nguyên mẫu". Vì vậy, tôi đã đọc tất cả câu trả lời ở trên và thử bằng câu trả lời của họ. Kết quả là, tôi tiếp cận rằng không có cách nào để phát hiện một tiêu diệt ngay cả đậu nguyên mẫu.

Mặc dù các phương thức gọi lại vòng đời khởi tạo được gọi trên tất cả các đối tượng bất kể phạm vi, trong trường hợp nguyên mẫu, các cuộc gọi lại vòng đời hủy cấu hình không được gọi.

thấy ở đây (https://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/beans.html#beans-factory-scopes-prototype)

1

ứng dụng của bạn có thể yêu cầu trường hợp mới của đậu nguyên mẫu mỗi 10 mili giây, làm điều gì đó với đậu, và sau đó để cho nó đi ra khỏi phạm vi. Nếu Spring phải hủy() chúng khi ứng dụng tắt, nó sẽ phải giữ một tham chiếu đến tất cả các bean nguyên mẫu được tạo ra, ngăn chúng bị thu gom rác, và do đó gây ra rò rỉ bộ nhớ.

Các vấn đề liên quan