10

メソッド context.getBean(name, user) のドキュメントには、

明示的なコンストラクター引数/ファクトリ メソッド引数を指定できるようにします

しかし、私が何をしても(すべてを試しました)、最も論理的な設定で、初期化中にBeanがロードされているときにこれを取得します:

org.springframework.beans.factory.UnsatisfiedDependencyException:
Error creating bean with name 'fileValidator' defined in
PortletContext resource
[/WEB-INF/classes/context/customer-form-portlet.xml]: Unsatisfied
dependency expressed through constructor argument with index 0 of type
[com.liferay.portal.model.User]: Ambiguous factory method argument
types - did you specify the correct bean references as factory method
arguments?
    org.springframework.beans.factory.UnsatisfiedDependencyException:
Error creating bean with name 'fileValidator' defined in
PortletContext resource
[/WEB-INF/classes/context/customer-form-portlet.xml]: Unsatisfied
dependency expressed through constructor argument with index 0 of type
[com.liferay.portal.model.User]: Ambiguous factory method argument
types - did you specify the correct bean references as factory method
arguments?

<bean id="fileValidator" 
      class="cz.instance.transl.validation.file.FileValidator" 
      factory-method="createInstance" />

private FileValidator(User user) {
    this.user = user;
}

public static FileValidator createInstance(User user) {
    return new FileValidator(user);
}

解説ではできると書いてありますが、そのbeanのxml定義でコンストラクタ引数を指定してもしなくても失敗します。

4

4 に答える 4

17

javadocは次のように述べています。

args - 静的ファクトリ メソッドへの明示的な引数を使用してプロトタイプを作成する場合に使用する引数。

したがって、Bean 定義はプロトタイプスコープの Bean でなければなりません。

<bean id="fileValidator" 
      scope="prototype" 
      class="cz.instance.transl.validation.file.FileValidator" 
      factory-method="createInstance" />
于 2011-07-22T06:37:12.360 に答える
10

20 の投稿を読んで、特にコンストラクター引数タグを使用し、コンテキスト内の既存の Bean をセットアップとして参照することを余儀なくされているため、実行時にカスタム ファクトリ メソッドを取得してパラメーターを取得する方法が明らかではないことがわかりました。以下と、静的ファクトリメソッドとして機能する問題のクラス。

<bean id="user" class="something.something.User" />

<bean id="fileValidator" 
      class="cz.instance.transl.validation.file.FileValidator" 
      factory-method="createInstance" >
      <constructor-args ref="user" />
</bean>

constructor-arg で使用されている Bean のインスタンスをコンテキストから取得し、実行時に使用する値を入力することで機能しました。この Bean は、工場で生成された Bean を取得するときにパラメーターとして使用されます。

public class X {

   public void callFactoryAndGetNewInstance() {
      User user = context.getBean("user");
      user.setSomethingUsefull(...);
      FileValidator validator = (FileValidator)context.getBean("fileValidator");
      ...
   }
}

これは context.getBean(arg1, arg2) の使用に関する問題を解決しないことに注意してください。その方法はこのシナリオでは関係がないためです。そうでない理由は、これらの Bean がすべてシングルトンであり、この時点でコンストラクターが呼び出されていないためです。シングルユーザーシステムで作業している場合、いつでもコンテキストに User Bean が 1 つしかないため、問題はありません。

ただし、マルチユーザー システムの場合は、実際のユーザーごとに一意のユーザー Bean があり、ファクトリ メソッドの呼び出しで正しいユーザー Bean を使用していることを確認する必要があります。

マルチユーザー システムでこれを行うには、Bean タイプをプロトタイプに変更する必要があります。また、ファクトリを表す FileValidator の Bean を作成する必要があります (ファクトリへの依存性注入を計画している場合) および別の Bean新しいインスタンスを表す FileValidator。どちらも同じクラス タイプになりますが、それぞれに一意の名前を付ける必要があります。下記参照:

<bean id="user" scope="prototype" class="something.something.User" />

<bean id="validatorFactory"
            class="cz.instance.transl.validation.file.FileValidator">
    <constructor-arg value="something" />
</bean>

<bean id="fileValidatorBean"
            class="cz.instance.transl.validation.file.FileValidator"
    scope="prototype"
    factory-method="createInstance" >
    <constructor-arg ref="user" />
</bean>

この新しい FileValidator Bean をファクトリから取得するクラスでは、次の手法を使用できます。

public void someMethod() {
    ...
    User user = context.getBean("user");
    user.setSomethingUsefull(...);

    FileValidator fileValidator = 
               (FileValidator)context.getBean("fileValidatorBean",
                                              user);
    ...
}
于 2012-11-06T01:22:35.760 に答える
8

ファクトリ メソッドを呼び出すために、Spring は createInstance に渡すユーザー インスタンスにアクセスする必要があります。この場合、Bean を作成して渡すだけです。

<bean id="user" class="something.something.User">
</bean>

<bean id="validator" class="cz.instance.transl.validation.file.FileValidator" factory-method="createInstance">
    <constructor-arg ref="user"/>
</bean>
于 2011-07-22T06:24:21.497 に答える
6

factory-bean 属性を設定する抽象ファクトリも使用できます。ここには、アクションを作成する ActionFactory があります。

<bean id="actions_factory" class="com.imagina.control.actions.impl.ActionFactoryImpl"/>

<bean id="load_person_action" class="com.imagina.control.actions.impl.LoadPersonAction" 
  factory-bean="actions_factory" factory-method="create">
  <constructor-arg value="load_person_action"/>      
</bean>

この構成を使用するには、次の点を考慮する必要があります。

  1. create メソッドは静的ではありません。インスタンスに属するようになりました
  2. constructor-arg はファクトリ メソッドのパラメータです
于 2012-01-19T13:38:39.537 に答える