2012-02-04 12 views
8

Trudno wyjaśnić, czego naprawdę chcę. Mam interfejs, który ma metodę getRuntimeInfo(), która dostarcza mi wszystkich informacji o debugowaniu środowiska wykonawczego dla zmiennych klasy. Chcę zobaczyć listę wszystkich klas, które implementują ten interfejs. Używam Java i Spring. Jednym ze sposobów, w jaki mogę to zrobić, jest pobranie wszystkich ziaren z kontekstu wiosennego i sprawdzenie za pomocą operatora instanceof. Ale nie chciałbym tego robić z oczywistych wpływów na wydajność. Czy mam jakąś inną opcję?Śledzenie wszystkich klas implementujących dany interfejs?

Odpowiedz

13

Co o tym rozwiązaniu:

@Component 
public class WithAllMyInterfaceImpls { 

    @Autowire 
    List<MyInterface> allBeansThatImplementTheMyInterface; 

} 

lista jest wypełniana tylko raz (przy starcie), więc nie powinno to mieć znaczący wpływ na „normalnym” wydajności wykonawczego.


Komentarz:

można wyjaśnić kod

Wiesz Wiosna to MKOl pojemnika. @Component mówi Springowi, że powinna utworzyć instancję tej klasy (tak zwana Spring Managed Bean). IOC oznacza również, że Container jest odpowiedzialny za wprowadzanie odniesień do innych przypadków (Spring Managed Beans). @Autowire (a także @Resource i @Inject - wszystkie robią to samo) to taka adnotacja, która mówi Springowi, że to pole powinno być wypełnione wiosną. Sama wiosna próbuje dowiedzieć się, z jakimi instancjami należy zapełnić pole. Domyślną techniką, z której korzysta wiosna, jest by type, co oznacza, że ​​Spring sprawdza typ pola i wyszukuje pasujące ziarna. W twoim przypadku jest to ogólna lista - jest to trochę wyjątkowe. W tym przypadku Spring wypełni pole listą, w której elementami są wszystkie fasole pasujące do typu ogólnego.

+0

Jest to zwykła funkcja automatycznego wypalania sprężyny, nie ma w niej nic szczególnego. Jest to po prostu główna cecha sprężynowa: – Ralph

+0

@ user1117398: Przedłużyłem swoją odpowiedź, aby nieco to wyjaśnić. - Wygląda na to, że powinieneś przeczytać wiosnę 3.0 !!! lub 3.1 samouczek. – Ralph

Powiązane problemy