2013-09-30 20 views
3

我是Spring的新手。我的问题是如何将从数据库加载的值(来自db的业务单元的dyanmic列表)注入另一个bean以进行某些处理。来自数据库的动态列表的弹簧依赖注入

我正在从我的代码中执行以下操作。从数据库使用负载方法*/

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 */

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

/*加载业务单元

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 + "]"; 
    } 



} 

/*一些Serv冰,它调用DAO加载业务单元*/

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

} 

的Spring XML:

:用于测试的春天*/

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 ****/ 

问题

<?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> 

/*测试应用程序

如果假设,我想从服务HarmonyService的加载方法注入业务单元列表,该怎么做那?

假设我有一个处理器类,类似下面的BatchProcessor。

public class BatchProcessor { 


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

      } 

} 

如何注入动态创建的businessUnit成使用弹簧XML本地方法变量businessUnitList(请与Java代码和弹簧XML变化解释)。

  1. 是否可以将动态列表注入到本地方法变量中。
  2. 举例说明如何将值注入到实例变量中,假设上面的businessUnitList是可变实例而不是方法局部变量。

问候, Raghu


我带你去上面的回答。

正如我刚才所说,我对春天很新。我有一个想法,当我探索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。显示());我在这里发送hservice.show的动态列表,它连接到数据库并获取业务单元列表。

现在再次,我会调用BatchProcessor的处理方法。

这是做事的好方法吗?

基本上,当我们想要通过一个值的时候,我们需要用参数调用contextbean。

我的Spring 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> 

是吗?

回答

1

你可以在类似的线路箱BatchProcessorHarmonyService

<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 
    } 
} 
我建议,而不是使用Spring的真棒AOP功能来获得DI非容器管理类
+0

。这非常简单,非常通用。 –

+0

@JasperBlues:根据OP,他是Spring和DI的新手,所以我猜他在学习基础知识之前不应该深入AOP。 – anubhava

+0

你不需要知道AOP就可以使用这个功能--Spring为你处理它。最终的结果是在非容器管理类上的DI。 。这与您不需要知道AOP使用'@Transactional'注释相同的故事 - 也是基于AOP构建的。 –