2011-08-31 6 views
29

빈에 대한 클래스에는 public 생성자가 없지만 private 클래스 만 사용할 수 있습니까? Bean 생성시이 개인 생성자가 호출됩니까? 감사합니다. .개인 생성자가있는 Java Spring bean

+6

시도해보고 결과를 게시하는 것은 어떻습니까? – dm3

+0

어렵습니다. 나는 모든 출처를 가지고 있지 않습니다. – user710818

답변

52

예, 스프링은 개인 생성자를 호출 할 수 있습니다. 가시성에 관계없이 올바른 인수를 사용하여 생성자를 찾으면 리플렉션을 사용하여 액세스 가능한 생성자를 설정합니다.

+0

문서에 대한 참조를 제공해 주시겠습니까? 생성자에는 매개 변수가 있고이 인수에 대한 xml 파일에 값이 할당됩니다. – user710818

+0

당신은 bean이 특별히 private bean() {...}과 같은 것을 가지고 있다면 Spring이 그것을 호출 할 수 있다는 것을 의미합니까? 어떻게 그것이 가능한가, 그것은 "사적"의 전체 목적에 반하는 것이다. –

+0

미안하지만, 아마도 인자가없는 생성자 일 뿐이에요. 나는 내 자신의 프로젝트에서 내가 알아 차린 것에 불과하다. 스프링 문서에서 어디에서든지 본 적이 없다고 말할 수는 없습니다. 그러나 이것은 인스턴스화를 담당하는 클래스의 javadoc입니다.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

일반적으로 이러한 bean에는 정적 팩토리 메소드가 있으며, spring에 해당 메소드를 지정하여 해당 bean의 인스턴스를 얻을 수 있습니다. 3.3.1.3 here.을 참조하십시오. 이것은 가시성 제한을 피하기보다는 Spring에서 권장하는 방법입니다.

+0

이상한, 정적 메서드, 공용 생성자가 있지만 디버깅 할 때 - 개인 생성자가 호출됩니다! sun.reflect.NativeConstructorAccessorImpl – user710818

+0

자세한 내용/코드가 없으면 더 이상 설명 할 수 없습니다! –

+0

내가 틀렸다고 생각해. 특정 코드는 없습니다. 디버거에서는 표준 sun/spring 메소드 만 볼 수 있습니다. – user710818

3

당신은 항상 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"/> 

하고, factory 메소드 빈에 대한 의존성도 주입 할 수있다.

+0

흥미 롭지 만 공장을 찾을 수 없습니다. 다른 방법으로 존재할 수 있습니까? – user710818

+0

@Matthew : 그는 혹독한 제 3 자 코드 주위에 Spring을 개조하고있는 것으로 보입니다. 지저분 해지는 것 같습니다. –

+1

@Donal, 아니요. 나는 코멘트에서 그가 말한 것을 이해하지 못했습니다. –

2

예, 개인 생성자는 봄에 의해 호출됩니다. 내 코드를 고려 :

Bean 정의 파일 :

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

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); 
    } 

} 

위의 코드는 잘 작동합니다. 따라서 스프링은 private 생성자를 호출합니다.