2017-10-26 4 views
0

Ich habe eine Bohne mit Anmerkung @BeanWie @PreDestroy für eine Bean nennen erklärt mit @Bean Anmerkung

erklärt
@Bean 
public Set<DefaultMessageListenerContainer> beans() { 
    Set<DefaultMessageListenerContainer> containerSet = new HashSet<DefaultMessageListenerContainer>(); 

    return containerSet; 
} 

Ich habe einige Operationen durchgeführt werden, wenn ich die Bohne bin zu zerstören. Wie kann ich das erreichen?

Ich weiß, ich kann @ Predestroy Annotation auf eine Methode in einer Klasse mit @ Komponent kommentiert, aber nicht sicher, wie kann ich das tun, wenn @ Bean Annotation.

EDIT:

@Bean(destroyMethod="stopContainers") 
    public Set<DefaultMessageListenerContainer> containers() { 
     Set<DefaultMessageListenerContainer> containerSet = new HashSet<DefaultMessageListenerContainer>(); 

     return containerSet; 
    } 

    public void stopContainers(){ 
     Set<DefaultMessageListenerContainer> containerSet = containers(); 
     ...... 
     } 

    } 

Aber ich erhalte eine Fehlermeldung, kann nicht eine Methode mit dem Namen ‚stopContainers‘ auf Bean mit dem Namen ‚Container‘ finden zerstören Wie dieses Problem beheben?

Antwort

0

Im Allgemeinen können Sie destroyMethod Parameter für die @Bean Annotation angeben. Und definieren Sie die bestimmte Implementierung für diese Methode in Ihrer Bean-Klasse.

Da Sie Set verwenden, haben Sie keine Möglichkeit destroyMethod in die Set.class hinzuzufügen. Du musst also wrap es (wie Andrew proposed).

Eigentlich mag ich diese Art von Ansatz überhaupt nicht. Es scheint mehr vorzuziehen, keine Menge von Beans zu verwenden und eine andere Problemumgehung zu finden (indem man sie nacheinander zerstört). Meiner Meinung nach können Sie eine separate Manager-Klasse implementieren, die Operationen an Ihren Containern ausführt.

+1

'containerSet' muss umgebrochen/erweitert werden, damit' destroyMethod' angegeben werden kann. Alternativ kann die eingepackte/erweiterte Bean "DisposableBean" implementieren. –

+0

@AndrewS Wie kann ich das tun? Verpackt/erweitert? – hars

+0

Können Sie sich die Bearbeitung ansehen? Alex oder Andrew – hars

0

von anderen Kommentar Expanded - hier ein Beispiel ist zu wickeln:

@Bean(destroyMethod="stopContainers") 
public StoppableSetWrapper<DefaultMessageListenerContainer> containers() { 
    StoppableSetWrapper<DefaultMessageListenerContainer> wrapper = new StoppableSetWrapper<>(); 
    return wrapper; 
} 

public class StoppableSetWrapper<T> { 
    private final Set<T> containers = new HashSet<T>(); 

    public boolean add(T container) { 
     return containers.add(container); 
    } 

    // other Set related methods as needed... 

    public void stopContainers() { 
     // clean up... 
    } 
} 

Der Code, der die injizierte/autowired Bohne verwendet werden aktualisiert werden müssen, da die Bean-Typ geändert hat.

Verwandte Themen