2013-02-23 15 views
14

Jestem nowicjuszem w ramach wiosennej wersji, rozpoczętej kilkoma samouczkami, aby się jej nauczyć.Metoda zniszczenia fasoli sprężynowej, singletonu i prototypów

mam następujące pliki,

# 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> 

Kiedy biorę scope="singleton" mój Wyjście jest:

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

Kiedy biorę scope="prototype" moje wyjście jest:

xml configured initialize 
Inside setMessage 
Your Message : My message 

xmlDestroy() metoda jest wywoływana z singleton zakres fasoli, ale nie z prototype uprzejmie mi pomóc w dalszej

Czy to poprawne? jeśli tak, jakie są możliwe powody?

również mam kilka pytań w stylu:

jaka jest różnica czy relacja między ApplicationContext , AbstractApplicationContext and ClassPathXmlApplicationContext

Odpowiedz

34

xmlDestroy() metoda jest wywoływana z singleton zakres fasoli, ale nie z prototypem ponieważ

Wiosna nie udaje kompletny cykl prototypu Fasola: instancję kontenerów, konfiguruje, ozdabia i inaczej montuje obiekt prototypowy, oddaje go do klienta, a następnie nie ma dalszej wiedzy o tej prototypowej instancji. Aby zwolnić zasoby, spróbuj wdrożyć niestandardowy procesor postów.

odróżnieniu od pojedynczych ziaren gdzie pojemnik sprężyna zarządza kompletny cykl

Można przyjrzeć się tej podstawowej tutorial różnice pomiędzy różnymi kontekstami

zapoznac documentation

+0

Do zwalniania zasobów można zaimplementować DestructionAwareBeanPostProcessor zamiast zwykłego BeanPostProcessor. –

1

Jest to oczekiwane zachowanie. Spring nie może wiedzieć, kiedy skończysz używać prototypowego komponentu, więc destrukcja fasoli nie jest zarządzana przez Spring w przypadku prototypowych komponentów. Z dokumentacji:

Chociaż metody inicjalizacji cyklu oddzwonienia nazywane są na wszystkich obiektów, niezależnie od zakresu, w przypadku prototypów, skonfigurowany zniszczenie cyklu życia wywołania zwrotne nie są nazywane.

Aby uzyskać więcej informacji, patrz Spring documentation.

W odniesieniu do ApplicationContext s można wybrać ten, który najlepiej pasuje do danego zastosowania. Zależy to od tego, czy chcesz używać konfiguracji XML lub adnotacji, czy na przykład działasz w kontenerze serwletów. ApplicationContext sam jest interfejsem w katalogu głównym heirarchii typu.

2

Singleton fasola oznacza, że jest dokładnie jedno wystąpienie tego komponentu w kontekście aplikacji. Oznacza to, że jeśli zrobisz coś takiego:

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()); 

Zobaczysz "Moja wiadomość" na konsoli dwukrotnie.

Dla prototypowych fasoli za każdym razem, gdy spróbujesz pobrać jedną z nich z kontekstu aplikacji, otrzymasz nową instancję, więc jeśli ponownie uruchomisz powyższy kod, drugie wyjście konsoli będzie miało wartość "null".

Ponieważ kontener nie musi wywoływać metody niszczenia prototypowej fasoli, nie działa i zachowanie jest prawidłowe.

Różnica między tymi klasami polega na tym, że są one interfejsem, klasą abstrakcyjną i konkretną klasą odpowiednio, aby lepiej zrozumieć te pojęcia. Proponuję przeczytać oficjalną dokumentację oracle dla java tutaj: Oracle Java Tutorials.

-1

Proszę sprawdzić rodzaj swojego teleskopu w swoim wiosennym pliku konfiguracyjnym. Jeśli zakres = „prototyp”, a następnie zmienić go na zakres = „singleton”

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

0

Próbowałem również uzyskać zdarzenie zniszczenia fasoli, która znajduje się zakres jest „prototypem”. Więc czytam wszystkie odpowiedzi powyżej i próbuję ich odpowiedzi. W rezultacie dochodzę do wniosku, że nie ma sposobu, aby wykryć zniszczenie nawet prototypowej fasoli.

Chociaż metody inicjalizacji cyklu oddzwonienia nazywane są na wszystkich obiektach, niezależnie od zakresu, w przypadku prototypów, skonfigurowany zniszczenie callbacks cyklu życia nie są nazywane.

zobaczyć tutaj (https://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/beans.html#beans-factory-scopes-prototype)

1

aplikacja mogła poprosić o nowych przypadków prototypowych ziaren co 10 milisekund, coś zrobić z fasoli, a następnie pozwolić jej odejść poza zakresem. Jeśli Spring musiałaby zniszczyć() je, gdy aplikacja zostanie wyłączona, musiałaby odwołać się do każdej utworzonej prototypowej fasoli, uniemożliwiając jej zbieranie śmieci i powodując przeciek pamięci.

Powiązane problemy