1

動的にパラメータが入ってくるメソッドで Bean ( EmployeeSaver) をインスタンス化する必要があります。これらの値は構成時に設定されないため、コンストラクター セッターを使用できません。

サンプルコード:

class MyEmployeeBean{
    public void   saveEmployeeDetail (Employee employee , EmployeeHistory hist   ){
        EmployeeDetail detail = hist.getDetail();
        EmployeeSaver eSave = new EmployeeSaver(employee, detail)
        saver.saveEmployee();
    }
}

class EmployeeSaver {

    private Employee empl;
    private EmployeeDetail detail;

    public EmployeeSaver(Employee emp, EmployeeDetail det){

        empl = emp;
        detail = det;
    }

    public void saveEmployee(){
        // code to same the guy...
    }

}

MyEmployeeSaver クラスにはデフォルトのコンストラクターがないため、ランタイム例外がスローされます。hist.getDetail() を実行するまで employeeDetail がわからないため、次の構成を使用できません!

<bean id="mySaverBean" class="come.saver.EmployeeSaver">
    <constructor-arg name="empl" ref="employee" />
    <constructor-arg name="hist" ref = "employeeHistory" />
</bean>  

コンストラクタ引数でemployeeSaverBeanをインスタンス化する方法は?

4

1 に答える 1

1

Spring 構成で直接これを行うことはできませんが、この質問ApplicationContext.getBean(String beanName,Object...args)で説明されているように使用します。 Spring のコンテキストにアクセスするために実装する必要がありますMyEmployeeBeanApplicationContextAware

class MyEmployeeBean implements ApplicationContextAware {
  ApplicationContext applicationContext;

  void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    this.applicationContext = applicationContext;
  }

  public void   saveEmployeeDetail (Employee employee , EmployeeHistory hist   ){
        EmployeeDetail detail = hist.getDetail();
        EmployeeSaver eSave = (EmployeeSaver)this.applicationContextnew.getBean("mySaverBean", employee, detail);
        saver.saveEmployee();
    }
}

そしてbeans.xmlで

<bean id="mySaverBean" class="come.saver.EmployeeSaver" scope="prototype" />

scope="prototype"リクエストごとにSpringが新しいインスタンスを作成できるようにするには、忘れずに追加してください。

于 2013-08-29T17:59:07.887 に答える