2015-05-11 18 views
7

Próbuję określić zakres komponentu bean według jego nazwy.Jak programowo określić zakres komponentu bean?

Co znalazłem tak daleko jest:

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

W moim przypadku chcę, aby dowiedzieć się, czy fasola jest żądanie zakresu. W Springu są pewne wewnętrzne metody, z których mógłbym skorzystać, ale zastanawiam się, czy istnieje "właściwy" sposób na to.

+0

To tylko przypuszczenie, ale ponieważ zwykły kod aplikacji nie powinien w ogóle wiedzieć o zakresach, są szanse, że te metody wewnętrzne są jedyną opcją. – biziclop

+0

Nie musisz odkrywać go w czasie wykonywania. Jesteś projektantem aplikacji. Powinieneś *** już wiedzieć. – EJP

+1

@EJP W moim przypadku, w miejscu, w którym muszę wiedzieć, nie mam. Gdybym wiedział, że nie zapytam. – Sandro

Odpowiedz

4

Dobre pytanie.

Nie ma metody isRequst() w BeanFactory, ponieważ zakres żądania dotyczy tylko WWW.

Po prostu próbowałem znaleźć sposób, aby to zrobić i się nie udało. Mogę zaproponować Ci obejście, które zadziała, jeśli używasz adnotacji. Gdy pojawi się instancja komponentu bean, powiedz bean.getClass().getAnnotation(Scope.class). Jeśli to zwróci Scope zadzwoń pod numer value().

To nie jest metoda "naukowa", ale mam nadzieję, że wystarczająco dobre dla ciebie.

EDYTOWANIE

Inne podejście jest następujące. Ziarna zasięgu żądania są przechowywane w atrybucie żądania. Nie pamiętam teraz jego nazwy, ale możesz łatwo znaleźć to sam, po prostu sprawdź swoją prośbę w debugerze. Następnie sprawdź, czy istnieje odniesienie do twojej fasoli. Ta metoda jest prawdopodobnie lepsza, ale wymaga pewnych wysiłków w celu zbadania atrybutu żądania i struktury danych używanych przez framework Spring.

1

Następujące rozwiązanie działa dla przypadków ConfigurableApplicationContext:

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

po skontaktowaniu się z BeanDefinition s, rozwiązanie to działa także dla zakresów zwyczaj fasoli.

Powiązane problemy