2011-08-31 9 views
29

Bean用のクラスはpublicコンストラクタを持たず、プライベートしかできません。 このプライベートコンストラクタは、Beanの作成時に呼び出されますか?おかげさまで 専用コンストラクタを持つJava Spring Bean

+6

これを試してから結果を投稿するのはどうですか? – dm3

+0

難しいです - 私はすべてのソースを持っていません。 – user710818

答えて

52

はい、Springはプライベートコンストラクタを呼び出すことができます。可視性に関係なく、適切な引数を持つコンストラクタが見つかった場合、コンストラクタをアクセス可能に設定するためにリフレクションを使用します。

+0

docsへの参照を教えてください。コンストラクターにはパラメーターがあり、xmlファイルにはこの引数に値が割り当てられています。 – user710818

+0

あなたは、beanが特にprivate bean(){...}のようなものを持っていれば、それを呼び出すことができますか?それはどのように可能であり、それは「プライベート」の全目的に反するものです。 –

+0

申し訳ありませんが、私はおそらくそれが引数なしコンストラクタであることについて間違っています。私は自分のプロジェクトで気づいたことだけに挑戦しています。 Springのドキュメンテーションでどこでも見たことがあるとは言えません。しかしこれはインスタンス化を行うクラスの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には静的なファクトリメソッドがあります。そのメソッドを指定して、そのBeanのインスタンスを取得することができます。 3.3.1.3 here.を参照してください。これは、可視性の制限に反するのではなく、Springが推奨する方法です。

+0

strange、静的メソッドはありません。パブリックコンストラクタはありませんが、私がデバッグするときにプライベートコンストラクタが呼び出されます! by sun.reflect.NativeConstructorAccessorImpl – user710818

+0

詳細/コードなしでは、それ以上コメントすることはできません! –

+0

あなたが間違っていると思います。特定のコードはありません - 私はデバッガでは標準のsun/springメソッドのみを参照しています。 – user710818

3

あなたはいつもThe IoC container: Instantiation using an instance factory methodから、むしろデフォルトコンストラクタに頼るよりも、Beanを作成するファクトリメソッドを使用することができます。これは、あなたのBeanのデフォルト以外のコンストラクタを使用することができるという利点があり

<!-- 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"/> 

、およびファクトリメソッドBeanの依存関係も同様に挿入できます。

+0

ですが、私は工場を見つけることができません。別の方法で存在する可能性がありますか? – user710818

+0

@Matthew:彼は厄介な第三者コードの周りに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); 
    } 

} 

上記のコードは正常に動作します。したがって、春はプライベートコンストラクタを呼び出しました。

関連する問題