3

私は春が初めてです。私の質問は、データベースからロードされた値(データベースからのビジネスユニットの動的リスト)を処理のために別のBeanに注入する方法です。

私は自分のコードから次のことをしています。

                               /*** Sample code Starts here ****/

/* load メソッドを使用して、データベースからビジネス ユニットをロードします */

public class BusinessUnitDaoImpl implements BusinessUnitDao {

    private JdbcTemplate jdbctemplate;

    public BusinessUnitDaoImpl() {
        super();
    }

    public BusinessUnitDaoImpl(DataSource ds) {
        this.jdbctemplate=new JdbcTemplate(ds);
    }

    @Override
    public List<BusinessUnit> load() {
        String SQL = "select * from business_unit";
        List<BusinessUnit> businessunits = jdbctemplate.query(SQL,
                new BusinessUnitRowMapper());
        return businessunits;
    }
}

/* ビジネス ユニット行マッパー */

public class BusinessUnitRowMapper implements RowMapper<BusinessUnit> {

    public BusinessUnitRowMapper() {
        // TODO Auto-generated constructor stub
    }

    public BusinessUnit mapRow(ResultSet rs, int rowNum) throws SQLException {
          BusinessUnit bunit = new BusinessUnit();
          bunit.setBusinessUnitId(rs.getInt("business_unit_id"));
          bunit.setBusinessUnitDesc(rs.getString("business_unit_desc"));
          bunit.setCurrencyCode(rs.getString("currency_code"));
          return bunit;
       }


}

/* ビジネス ユニット VO */

public class BusinessUnit {

    private int businessUnitId;
    private String businessUnitDesc;
    private String currencyCode;


    public BusinessUnit() {
        super();
    }


    public int getBusinessUnitId() {
        return businessUnitId;
    }


    public void setBusinessUnitId(int businessUnitId) {
        this.businessUnitId = businessUnitId;
    }


    public String getBusinessUnitDesc() {
        return businessUnitDesc;
    }


    public void setBusinessUnitDesc(String businessUnitDesc) {
        this.businessUnitDesc = businessUnitDesc;
    }


    public String getCurrencyCode() {
        return currencyCode;
    }


    public void setCurrencyCode(String currencyCode) {
        this.currencyCode = currencyCode;
    }


    @Override
    public String toString() {
        return "BusinessUnit [businessUnitId=" + businessUnitId
                + ", businessUnitDesc=" + businessUnitDesc + ", currencyCode="
                + currencyCode + "]";
    }



}

/* ビジネス ユニットをロードするために dao を呼び出す Some Service */

public class HarmonyService {

    private BusinessUnitDao budao;
    private RequestDetails requestDetails;

    public HarmonyService(BusinessUnitDao budao,RequestDetails requestDetails) {
        this.budao=budao;
        this.requestDetails=requestDetails;
    }

    public List<BusinessUnit> show() {
        return budao.load();
    }

    public WFRequest getDetail(long requestId) {
        return requestDetails.load(requestId);
    }

}

春のxml:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <context:property-placeholder location="file:${databaseConfiguration}"/>

    <bean id="AmericasDataSource" class="dell.harmony.data.HarmonyBasicDataSource" destroy-method="close" >
       <property name="url"><value>${HarmonyAmericasDb.url}</value></property>
       <property name="driverClassName"><value>${HarmonyAmericasDb.driverClassName}</value></property>
       <property name="username"><value>${HarmonyAmericasDb.username}</value></property>
       <property name="password"><value>${HarmonyAmericasDb.password}</value></property>
       <property name="removeAbandoned"><value>${HarmonyAmericasDb.removeAbandoned}</value></property>
       <property name="initialSize"><value>${HarmonyAmericasDb.initialSize}</value></property>
       <property name="maxActive"><value>${HarmonyAmericasDb.maxActive}</value></property>
    </bean>

    <bean id="EMEADataSource" class="dell.harmony.data.HarmonyBasicDataSource" destroy-method="close" >
       <property name="url"><value>${HarmonyEMEADb.url}</value></property>
       <property name="driverClassName"><value>${HarmonyEMEADb.driverClassName}</value></property>
       <property name="username"><value>${HarmonyEMEADb.username}</value></property>
       <property name="password"><value>${HarmonyEMEADb.password}</value></property>
       <property name="removeAbandoned"><value>${HarmonyEMEADb.removeAbandoned}</value></property>
       <property name="initialSize"><value>${HarmonyEMEADb.initialSize}</value></property>
       <property name="maxActive"><value>${HarmonyEMEADb.maxActive}</value></property>
    </bean>

    <bean id="budao" class="test.dao.BusinessUnitDaoImpl">
        <constructor-arg index="0"><ref bean="AmericasDataSource"/></constructor-arg>
     </bean>

     <bean id="requestdao" class="test.dao.RequestDetailImpl">
        <constructor-arg index="0"><ref bean="AmericasDataSource"/></constructor-arg>
     </bean>

    <bean id="service" class="test.service.HarmonyService">
        <constructor-arg index="0"><ref bean="budao"/></constructor-arg>
        <constructor-arg index="1"><ref bean="requestdao"/></constructor-arg>
     </bean>

</beans>

/* スプリングをテストするためのテスト アプリケーション */

public class MyApp {

    public static void main(String args[]) {
        ApplicationContext context = 
            new ClassPathXmlApplicationContext("Spring-All-Module.xml");
        HarmonyService hservice = (HarmonyService) context.getBean("service");
        System.out.println(hservice.show());
        System.out.println(hservice.getDetail(13090000000001L));
    }

}

                /*** Sample code ends here ****/

質問:

たとえば、サービス HarmonyService の load メソッドからビジネス ユニットのリストを挿入したいのですが、どうすればよいですか?

以下の BatchProcessor のようなプロセッサクラスがあるとします。

public class BatchProcessor {


          public List<BusinessUnit> proces(List<BusinessUnit> businessUnitList ) {
                 //do some processing here.

           }

}

spring xmlを使用して、動的に作成されたbusinessUnitをローカルメソッド変数businessUnitListに注入する方法(javaコードとspring xmlの変更で説明してください)。

  1. 動的リストにローカル メソッド変数を挿入することは可能ですか。
  2. 上記のbusinessUnitListがメソッドローカル変数ではなくインスタンス変数であると仮定して、インスタンス変数に値を注入する方法の例を挙げてください。

よろしく、 ラグー


上記の回答とさせていただきます。

前に言ったように、私は春が初めてです。Stackoverflowの別の質問を調べたときに、アイデアが浮かびました。

businessUnitList をインスタンス変数と仮定します。

public class BatchProcessor {

    public BatchProcessor(List<BusinessUnit> businessUnitList) {
        this.businessUnitList=businessUnitList;
    }

    private List<BusinessUnit> businessUnitList;

    public List<BusinessUnit> getBusinessUnitList() {
        return businessUnitList;
    }

    public void setBusinessUnitList(List<BusinessUnit> businessUnitList) {
        this.businessUnitList = businessUnitList;
    }

    public List<BusinessUnit> process() {
        System.out.println("Started processing the business Units" + businessUnitList);
        //do some processing
        return this.businessUnitList;
    }

MyApp メイン プログラムから、これを行うことができます。

BatchProcessor bprocess = (BatchProcessor) context.getBean("bprocessor", hservice.show());
System.out.println(bprocess.process());

//context.getBean("bprocessor",hservice.show()); ここでは、データベースに接続してビジネス ユニットのリストを取得する hservice.show から動的リストを送信しています。

もう一度、BatchProcessor のプロセス メソッドを呼び出します。

これは物事を行う良い方法ですか?

基本的に動的に値を渡したいときは、contextbean を引数で呼び出す必要があります。

私の春のxml:

<!-- passing a dummy list to the constructor -->

 <bean id="bprocessor" class="test.rules.BatchProcessor" scope="prototype">
  <constructor-arg type="java.util.List">
        <list>
            <ref bean="bunit"/>
        </list> 
  </constructor-arg>

私は正しいですか?

4

1 に答える 1

1

BatchProcessor同様の行でクレートできますHarmonyService

<bean id="service" class="test.service.BatchProcessor">
    <constructor-arg index="0"><ref bean="budao"/></constructor-arg>
</bean>

次に内部BatchProcessor

public class BatchProcessor {
    private BusinessUnitDao budao;

    public BatchProcessor(BusinessUnitDao dao) {
        this.budao = dao;
    }

    public List<BusinessUnit> process() {
       // process budao.load() list here
    }
}
于 2013-09-30T10:59:17.770 に答える