2012-08-30 10 views
13

Używam config Java oparte skonfigurować moją kontekstu aplikacji Wiosna tak:Jak ładować wszystkie ziarna leniwie za pomocą @ComponentScan na wiosnę?

@Configuration 
@Lazy 
@ComponentScan(basePackageClasses = {MyProject.class, OtherProject.class}) 
public class MyAppConfig { 
    ... 
} 

Fasola wyraźnie zdefiniowane w config są ładowane leniwie, jak można by oczekiwać. Jednak zeskanowane klasy opatrzone przypisami @Named są zawsze ładowane z zapałem. Jak mogę to rozwiązać?

Każda pomoc jest doceniana.


Zauważ, że na zajęcia w pakiecie MyProject mogę obejść ten problem przez komentowania ich @Lazy również. Ale drugi projekt nie jest zależny od Springa i chcę go utrzymywać (stąd @Named, a nie @Component).


Należy również zauważyć, że nie jest to problem w konfiguracji opartej na XML. Tam, ustawiając default-lazy-init="true" w szwach tagów, aby zrobić to, co chcę (chociaż tego nie przetestowałem).

+3

Więc spróbuj dodać małe ' 'plik XML i pozostaw resztę konfiguracji Java. Jeśli nie można tego zrobić za pomocą '@ Configuration', nie wahaj się podnieść [problem] (https://jira.springsource.org/secure/Dashboard.jspa). –

+0

sprawdź to: http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/context/annotation/Lazy.html – Elbek

+2

Jest otwarty raport o błędzie: https: // jira.spring.io/browse/SPR-10459 –

Odpowiedz

12

Począwszy od wersji 4.1 RC2, ten problem został rozwiązany i można wykonać leniwy załadunku na skanie składnika z:

@ComponentScan(basePackages = ["..."], lazyInit = true) 

https://jira.spring.io/browse/SPR-10459

+0

Awesome. Pomaga to uprościć moje konfiguracje w trybie junit. – Basil

2

Jak już wcześniej wspomniano, nie ma bezpośredniego sposobu, aby sobie z tym poradzić (używając @Lazy w klasie konfiguracji). Ale możesz spróbować z takim podejściem:

Przypuszczam, że OtherProject to projekt, który nie korzysta ze Springa i wyobraź sobie, że te klasy nie są adnotowane.

Następnie należy zdefiniować w myproject konfigurację, która wygląda tak:

@Configuration 
// Avoid use this line if classes aren't annotated @ComponentScan("com.otherProject") 
public class MyProjectConfig { 

    @Bean(name = "lazyBean") 
    @Lazy 
    public LazyBean lazyBean(){ 
     System.out.println("Loading LazyBean bean"); 
     return new LazyBean(); // Or use a static method factory, this is only an example 
    } 
} 

Używanie tego, fasola „lazyBean” zostanie utworzone, gdy jakiś przykład wstrzyknąć go lub kiedy jawnie nazwać, ale nigdy na czas inicjacji.

Pamiętaj, że musisz zdefiniować nowy komponent dla każdej klasy, z której chcesz korzystać, więc nie jest to dobre, jeśli masz mnóstwo klas, ale dobrze, aby zminimalizować dostępność klas innych projektów (być może nie wszystkie zajęcia są konieczne).

Mam nadzieję, że to pomoże.

+0

W rzeczywistości, klasy innych projektów * są * opatrzone przypisami, ale z '@ Named'. Dlatego chciałem skorzystać z '@ ComponentScan' i uniknąć konieczności definiowania wszystkich fasoli jawnie. Ale dziękuję za poświęcony czas, przyjmuję twoją odpowiedź. – rolve

Powiązane problemy