2011-08-10 15 views
16

mam kolejną sytuację: Connection manager powinien mieć za każdym razem jeden obiekt ConnectionServer i nowych obiektów DataBean Więc stworzyliśmy te ziarna i skonfigurowany się, że sprężyny xml .Wiosna: Tworzenie nowej instancji fasola dla każdego wywołania metody get

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> 

    <bean id="dataBena" class="com.test.DataBean" scope="prototype"/> 
    <bean id="servCon" class="com.test.ServerCon"/> 
    <!--<bean id="test" class="com.test.Test"/>--> 
    <context:component-scan base-package="com.test"/> 
</beans> 

i dodaje zakres prototype dla DataBean

Po to stworzyłem prosty util/klasy komponentów zwany test

@Component 
public class Test { 

    @Autowired 
    private DataBean bean; 
    @Autowired 
    private ServerCon server; 

    public DataBean getBean() { 
     return bean.clone(); 
    } 

    public ServerCon getServer() { 
     return server; 
    } 

} 

BUT, za każdym razem z wywołaniem metody klonowania getBean ja() ta fasola, i to jest dla mnie problem. Czy mogę to zrobić z konfiguracji wiosna bez użycia metody klonowania? Dzięki.

Odpowiedz

32

Szukasz funkcji lookup method na wiosnę. Chodzi o to, że podasz abstrakcyjnej metody takie jak to:

@Component 
public abstract class Test { 
    public abstract DataBean getBean(); 
} 

I powiedz sprężyny, która powinna wdrożyć go w czasie wykonywania:

<bean id="test" class="com.test.Test"> 
    <lookup-method name="getBean" bean="dataBean"/> 
</bean> 

Teraz za każdym razem, gdy nazywają Test.getBean będzie faktycznie nazwać Wiosna generowane metoda. Ta metoda poprosi o instancję ApplicationContext dla instancji dla instancji ApplicationContext. Jeśli ten komponent będzie miał zasięg prototype, za każdym razem, gdy go wywołasz, otrzymasz nową instancję.

Pisałem o tej funkcji here.

+1

Wystarczy dodać [cglib.jar] (http://repo1.maven.org/maven2/cglib/cglib/2.2.2/cglib-2.2.2.jar) do swojej zmiennej CLASSPATH. –

+0

i asm-all-3.3.1.jar też :), Dzięki wszystkim działa dobrze! –

+0

Jak byś sobie z tym poradził, gdyby 'DataBean' miał charakter ogólny i gdyby w środku był' Service ', który jest' @ Autowired' w zależności od typu ''? –

Powiązane problemy