web-dev-qa-db-ja.com

Javaプライベートコンストラクターを備えたSpring Bean

Springでは、Beanのクラスにパブリックコンストラクターがなく、プライベートコンストラクターしかありませんか?このプライベートコンストラクターは、Beanの作成時に呼び出されますか?ありがとう。

41
user710818

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

67

IoCコンテナー:インスタンスファクトリメソッドを使用したインスタンス化 から、デフォルトコンストラクターに依存するのではなく、常にファクトリメソッドを使用して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にデフォルト以外のコンストラクターを使用でき、ファクトリーメソッドBeanの依存関係も注入できるという利点があります。

3
Matthew Farwell

はい、プライベートコンストラクターはSpringによって呼び出されます。私のコードを考えてみましょう:

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

}

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

3
Ashish Ani

通常、このようなBeanには静的なファクトリメソッドがあります。そのメソッドを指定して、そのBeanのインスタンスを取得するSpringを指定できます。ここで 3.3.1.3を参照してください。 これは、可視性の制限に逆らうのではなく、Springが推奨する方法です。

0
Ashkan Aryan

はい ! Springはプライベートコンストラクタにアクセスできます。以下のコードのように内部的に動作します。

       try{
    Class c= Class.forName("A"); // A - className
    Constructor c1[]=c.getDeclaredConstructors();
    c1[0].setAccessible(true);
    A a= (A)c1[0].newInstance();
    }
    catch (Exception e){
        e.printStackTrace();
    }
0
gnana jeyam95