2008-09-19 13 views
7

Moja warstwa modelu jest używana przez kilka różnych projektów i chciałbym użyć pojedynczego pliku konfiguracji Spring Spring dla modelu, niezależnie od tego, który projekt go używa.Czy posiadanie wielu nieużywanych ziaren w kontekście wiosny fasoli marnuje znaczne zasoby?

Moje pytanie brzmi: Ponieważ nie wszystkie ziarna są używane we wszystkich projektach, czy marnuje się zasoby na znaczną ilość, jeśli nie ma instancji? Nie jestem zbyt pewny, jak leniwa wiosna jest na temat ich ładowania, ponieważ do tej pory nie było problemu.

Wszelkie pomysły?

Odpowiedz

7

Zrobione z Spring Reference Manual:

Zachowanie domyślne dla implementacji ApplicationContext jest chętnie pre-instancję wszystkie singleton fasoli na starcie. Wstępne tworzenie instancji oznacza, że ​​obiekt ApplicationContext będzie chętnie tworzyć i konfigurować wszystkie pojedyncze komponenty bean w ramach procesu inicjowania. Ogólnie jest to dobre, ponieważ oznacza to, że wszelkie błędy w konfiguracji lub w otaczającym środowisku zostaną natychmiast wykryte (w przeciwieństwie do możliwych godzin lub nawet dni w dół linii).

Istnieją jednak sytuacje, w których takie zachowanie nie jest zgodne z oczekiwaniami. Jeśli nie chcesz, aby komponent singleton bean był wstępnie instancjonowany podczas korzystania z ApplicationContext, możesz to kontrolować selektywnie, oznaczając definicję komponentu bean jako zainicjowaną leniwą. Leniwie zainicjowany komponent bean wskazuje do kontenera IoC, czy instancja komponentu bean ma być tworzona podczas uruchamiania, czy też, gdy jest wymagana.

Podczas konfigurowania ziaren za pomocą XML, to leniwy ładunek jest kontrolowany przez atrybut "lazy-init" na [elemencie bean]; na przykład:

<bean id="lazy" class="com.foo.ExpensiveToCreateBean" lazy-init="true"/> 

Ale, chyba że ziarna są przy użyciu zasobów, takich jak zamki plików lub połączenia z bazą danych, nie będę się zbytnio obawiać o prostej napowietrznych pamięci, jeśli jest to łatwiejsze, aby mieć tę jedną konfigurację dla wielu (ale różnych) profili.

0

Domyślnie fasola szparagowa jest pojedynczą jednostką i tworzy instancję po utworzeniu kontekstu aplikacji (przy uruchomieniu). Zakładając, że nie zastąpiłeś domyślnego zachowania, zostanie utworzone jedno wystąpienie każdego komponentu bean.

-1

Zależy od obiektów.

Ale nieużywany kod jest "cruft" i zwiększy koszty konserwacji.

Lepiej usunąć reflekcje i klasy. Zawsze możesz przywrócić kontrolę wersji, jeśli będą potrzebne później.

+2

Ponieważ wszystkie zajęcia są stosowane, po prostu nie w każdym projekcie, usunięcie niczego nie wchodzi w grę. –

5

Oprócz innych komentarzy: możliwe jest również określenie leniwie inicjowanego pliku konfiguracyjnego za pomocą atrybutu "default-lazy-init" w elemencie <beans/>; na przykład:

<beans default-lazy-init="true"> 
    <!-- no beans will be pre-instantiated... --> 
</beans> 

Jest to znacznie łatwiejsze niż dodawanie atrybutu lazy-init do każdego fasoli, jeśli masz dużo z nich.

Powiązane problemy