2012-03-02 1 views
0

Im using Spring 3.0 и JDBC В настоящее время я экспериментирую с весной для настольного приложения. Каждый раз, когда классу нужно будет использовать источник данных, объявленный в моем spring_bean_file.xml, мне нужно было бы объявить каждый из них в файле xml и снова инициализировать каждый из них в моем классе.
Ниже мой XML-файлКак упростить добавление нескольких компонентов в XML-файл, который использует источник данных весной

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
     <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/> 
     <property name="url" value="#{T(java.lang.System).getenv(DB_URL')}"/> 
     <property name="username" value="#{T(java.lang.System).getenv('DB_USER')}"/> 
     <property name="password" value="#{T(java.lang.System).getenv('DB_PASS')}"/>   
    </bean> 


<bean id="classA" class="com.example.ClassA"> 
    <property name="dataSource" ref="dataSource"/> 
</bean> 

<bean id="classB" class="com.example.ClassB"> 
    <property name="dataSource" ref="dataSource"/> 
</bean> 

Это мой Java-код:

public static void main(String[] args) {   

     ApplicationContext context = new ClassPathXmlApplicationContext("spring_bean_file.xml"); 
      ClassA classA = (ClassA) context.getBean("classA"); 
      ClassB classB = (ClassB) context.getBean("classB"); 
      try { 
       rrRpi.generateRrRpi(); 
       rrSpi.generateRrSpi(); 
      } catch (SQLException e) { 

       e.printStackTrace(); 
      } catch (IOException e) { 

       e.printStackTrace(); 
      } 

     //close the context    
     ((ClassPathXmlApplicationContext) context).close(); 

    } 

Id хотел бы знать, если Theres более эффективный способ сделать это. Какой лучший подход, поэтому мне не нужно было добавлять компонент для каждого класса, который будет использовать DataSoruce. Спасибо заранее, ребята.

+1

В чем проблема? Вы можете объявить bean-шаблон с помощью abstract = "true" и использовать parent = "myBean", чтобы добавить общее объявление полей для каждого компонента. –

+0

Я не хочу инициализировать каждый компонент в моем классе для каждого класса, для которого потребуется dataSource, например. ClassA classA = (ClassA) context.getBean ("classA"); ClassB classB = (ClassB) context.getBean ("classB"); – royjavelosa

+0

Почему вы их не вводите? –

ответ

1

Вы можете использовать:

Аннотации и CLASSPATH сканирования определение

@Service 
public class ClassA { 
    @Resource 
    private DataSource dataSource; 

    //... 
} 

@Service 
public class ClassB { 
    @Resource 
    private DataSource dataSource; 

    //... 
} 

dataSource по-прежнему должен быть в XML, также необходимо заменить classA и classB<bean/> определения с простым:

<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.xsd"> 

    <context:component-scan base-package="com.example" /> 

    <!-- ... --> 
</beans 

@ Конфигурация

Или вы можете воспользоваться совершенно новой, но захватывающей конфигурации Java:

@Configuration 
public class Cfg { 

    @Bean 
    public DataSource dataSource() { 
     BasicDataSource ds = new BasicDataSource(); 
     ds.setDriverClassName("oracle.jdbc.driver.OracleDriver); 
     //... 
     return ds; 
    } 

    @Bean 
    public ClassA classA() { 
     ClassA ca = new ClassA() 
     ca.setDataSource(dataSource()); 
     return ca; 
    } 

    @Bean 
    public ClassB classB() { 
     ClassB cb = new ClassB() 
     cb.setDataSource(dataSource()); 
     return cb; 
    } 

} 

Преимущество этого подхода заключается в том, что вам не нужно XML, на все:

new AnnotationConfigApplicationContext(Cfg.class); 

Смотрите также
  • What is meant by abstract="true" in spring? - о том, как избежать объявления дублированных зависимостей (dataSource фактически используется в качестве примера).
+0

Могу ли я объявить более одного <контекст: компонент-сканирование base-package = "com.example" /> на всякий случай, если классы из разных пакетов? – royjavelosa

+0

@royjavelosa: конечно –

+0

Я пробовал подход к сервису/ресурсу, но он говорит префикс «контекст» для элемента «context: component-scan» не связан. – royjavelosa

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