2015-05-11 12 views
7

ermitteln Ich versuche, den Geltungsbereich einer Bean anhand ihres Namens herauszufinden.Wie programmgesteuert den Geltungsbereich einer Bean

Was ich bisher gefunden ist:

BeanFactory#isPrototype(String name) 
      #isSingleton(String name) 

In meinem Fall habe ich, wenn die Bohne im Request-Scope ist es, herauszufinden wollen. Es gibt einige interne Methoden im Spring-Framework, die ich verwenden könnte, aber ich frage mich, ob es einen "richtigen" Weg gibt, es zu tun.

+0

Dies ist nur eine Vermutung, aber da regulärer Anwendungscode über Bereiche überhaupt nicht wissen sollte, sind die internen Methoden wahrscheinlich die einzige Möglichkeit. – biziclop

+0

Sie sollten es zur Laufzeit nicht entdecken müssen. Sie sind der Entwickler der Anwendung. Du solltest es *** *** schon wissen. – EJP

+1

@EJP In meinem Fall, in dem Ort, wo ich wissen muss, ich nicht. Wenn ich wüsste, würde ich nicht fragen. – Sandro

Antwort

4

Gute Frage.

Es gibt keine Methode isRequst() in BeanFactory, da der Anforderungsbereich nur für das Internet relevant ist.

Ich habe gerade versucht, den Weg zu finden, und dies ist fehlgeschlagen. Also kann ich Ihnen einen Work-Around vorschlagen, der funktioniert, wenn Sie Anmerkungen verwenden. Wenn Sie eine Bean-Instanz erhalten, sagen Sie bean.getClass().getAnnotation(Scope.class). Wenn dies zurückgibt, rufen Sie Scopevalue().

Dies ist nicht "wissenschaftliche" Methode, aber hoffentlich gut genug für Sie.

BEARBEITEN

Andere Vorgehensweise ist die folgende. Die Anforderungsbereichsbeans werden im Anforderungsattribut gespeichert. Ich erinnere mich nicht an seinen Namen, aber Sie können es leicht selbst finden, untersuchen Sie einfach Ihre Anfrage im Debugger. Überprüfen Sie dann, ob der Verweis auf Ihre Bean vorhanden ist. Diese Methode ist wahrscheinlich besser, erfordert jedoch einige Anstrengungen, das Anforderungsattribut und die Datenstruktur des Spring-Frameworks zu untersuchen.

1

Die folgende Lösung wird für Instanzen von ConfigurableApplicationContext arbeiten:

import org.springframework.beans.factory.config.BeanDefinition; 
import org.springframework.context.ConfigurableApplicationContext; 

public String getScope(ConfigurableApplicationContext context, String sourceBean) { 
    BeanDefinition beanDefinition = context.getBeanFactory().getMergedBeanDefinition(sourceBean); 
    return beanDefinition.getScope(); 
} 

Durch die Anhörung des BeanDefinition s wird diese Lösung auch für benutzerdefinierten bean Tive arbeiten.

Verwandte Themen