2011-08-31 26 views
29

Czy jest możliwe na wiosnę, że klasa dla fasoli nie ma publicznego konstruktora, ale tylko prywatny? Czy ten prywatny konstruktor zostanie wywołany po utworzeniu komponentu bean? Dzięki.Java Spring bean z prywatnym konstruktorem

+6

Co powiesz na wypróbowanie, a następnie opublikowanie wyników? – dm3

+0

To jest trudne - nie mam całego źródła. – user710818

Odpowiedz

52

Tak, Spring może wywoływać prywatnych konstruktorów. Jeśli znajdzie konstruktor z właściwymi argumentami, niezależnie od widoczności, użyje odbicia, aby ustawić jego konstruktor jako dostępny.

+0

Czy możesz podać mi odniesienie do dokumentów? Konstruktor ma parametry, aw pliku xml do tych argumentów przypisane wartości. – user710818

+0

masz na myśli, że jeśli fasola ma konkretnie coś takiego jak prywatna fasola() {} {}} wiosna może ją wywołać? Jak to możliwe, że sprzeciwia się celowi "prywatne". –

+0

Przepraszam, prawdopodobnie jestem w błędzie, ponieważ to tylko konstruktorzy no-arg. Po prostu przechodzę przez to, co zauważyłem w swoich własnych projektach. Nie mogę powiedzieć, że kiedykolwiek widziałem to w dokumentacji Spring. Ale to jest javadoc dla klasy, która jest odpowiedzialna za tworzenie instancji.http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/beans/BeanUtils.html#instantiateClass(java.lang.reflect.Constructor,%20java.lang.Object .. .) –

-2

Normalnie w takich ziarnach zwykle znajduje się statyczna metoda fabryczna, można określić tę metodę dla sprężyny, aby uzyskać instancję tego komponentu bean. Zobacz 3.3.1.3 here. Tak zaleca się wiosną, zamiast ograniczać widoczność.

+0

Dziwne, nie ma metody statycznej, nie ma publicznego konstruktora, ale kiedy robię debugowanie - wywoływany jest prywatny konstruktor! autor: sun.reflect.NativeConstructorAccessorImpl – user710818

+0

Bez podania szczegółów/kodu nie będzie można komentować dalej! –

+0

Przypuszczam, że się mylisz. Nie ma określonego kodu - w debugerze widzę tylko standardowe metody słońca/wiosny. – user710818

3

Zawsze można użyć metody fabryki stworzyć fasolę zamiast polegać na domyślnego konstruktora z The IoC container: Instantiation using an instance factory method:

<!-- the factory bean, which contains a method called createInstance() --> 
<bean id="serviceLocator" class="com.foo.DefaultServiceLocator"> 
    <!-- inject any dependencies required by this locator bean --> 
</bean> 

<!-- the bean to be created via the factory bean --> 
<bean id="exampleBean" 
     factory-bean="serviceLocator" 
     factory-method="createInstance"/> 

Ma to tę zaletę, że można użyć niestandardowych konstruktorów do fasoli i można również wstrzyknąć zależności dla fasoli metod fabryki.

+0

interesujące, ale nie mogę znaleźć fabryki. Może być inaczej? – user710818

+0

@Matthew: Wygląda na to, że instaluje Spring wokół jakiegoś popularnego kodu innej firmy. To tylko _brak_, żeby być brudny. –

+1

@Donal, nie, nie rozumiem, co powiedział w komentarzu. –

2

Tak, prywatne konstruktorzy są wywoływane wiosną. Rozważmy mój kod:

Bean plik definicji:

<bean id="message" class="com.aa.testp.Message"> 
     <constructor-arg index="0" value="Hi Nice"/> 
    </bean> 

klasa Bean:

package com.aa.testp; 

public class Message { 

    private String message; 

    private Message(String msg) { 
     // You may add your log or print statements to check execution or invocation 
     message = msg; 
    } 

    public String getMessage() { 
     return message; 
    } 

    public void setMessage(String message) { 
     this.message = message; 
    } 

    public void display() { 
     System.out.println(" Hi " + message); 
    } 

} 

Powyższy kod działa poprawnie. W związku z tym wiosna odwołała się do prywatnego konstruktora.

Powiązane problemy