Springでは、Beanのクラスにパブリックコンストラクターがなく、プライベートコンストラクターしかありませんか?このプライベートコンストラクターは、Beanの作成時に呼び出されますか?ありがとう。
はい、Springはプライベートコンストラクターを呼び出すことができます。可視性に関係なく、適切な引数を持つコンストラクターを見つけると、リフレクションを使用して、コンストラクターをアクセス可能に設定します。
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の依存関係も注入できるという利点があります。
はい、プライベートコンストラクターは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はプライベートコンストラクターを呼び出しました。
通常、このようなBeanには静的なファクトリメソッドがあります。そのメソッドを指定して、そのBeanのインスタンスを取得するSpringを指定できます。ここで 3.3.1.3を参照してください。 これは、可視性の制限に逆らうのではなく、Springが推奨する方法です。
はい ! 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();
}