2013-09-30 2 views
3

Я новичок в Spring. Мой вопрос заключается в том, как ввести значение, загруженное из базы данных (dyanmic list of business units from db) в другой компонент для некоторой обработки.Впрыск весенней зависимости для динамического списка из базы данных

Я делаю следующее из своего кода.

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

/* БЕ Row Mapper */

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



} 

/* Some Serv лед, который вызывает дао для загрузки бизнес-единицы */

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:

<?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, как это сделать что?

Предположим, у меня есть класс процессора, что-то вроде BatchProcessor ниже.

public class BatchProcessor { 


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

      } 

} 

как придать динамически созданный businessUnit в локальный метод переменной businessUnitList с помощью пружинного XML (пожалуйста, объясните с Java кодом и изменения весной XML).

  1. Можно ли вводить динамический список в локальную переменную метода.
  2. Приведите пример того, как вводить значение в переменную экземпляра, предполагая, что указанный выше businessUnitList является экземпляром varaible вместо локальной переменной метода.

С уважением, 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 Main я могу это сделать.

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

//context.getBean("bprocessor",hservice.показать()); здесь я отправляю динамический список из hservice.show, который подключается к базе данных и получает список бизнес-единиц.

теперь снова, i'lll вызывать метод процесса BatchProcessor.

Это хороший способ сделать что-то?

В принципе, когда мы хотим передать значение, мы должны вызвать, contextbean, с аргументом.

My 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

Вы можете обрешетка 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 
    } 
} 
+0

я рекомендую вместо того, чтобы с помощью удивительного AOP в Spring предлагается получить DI на не контейнерные управляемых классах. Это очень просто и очень универсально. –

+0

@ JasperBlues: В соответствии с OP он является новым для Spring и DI, поэтому я думаю, что он не должен погружаться в АОП, прежде чем изучать основы. – anubhava

+0

Вам не нужно знать AOP, чтобы использовать эту функцию - Spring заботится о ней для вас. Конечным результатом является DI на неконтейнерных управляемых классах. , Это та же история, что вам не нужно знать AOP, чтобы использовать аннотацию @Transactional, которая также основана на AOP. –

Смежные вопросы