Как упростить добавление нескольких bean-компонентов в XML-файл, который использует источник данных в Spring - PullRequest
0 голосов
/ 02 марта 2012

Я использую Spring 3.0 и JDBC. В настоящее время я экспериментирую с Spring для настольных приложений.Каждый раз, когда класс должен использовать источник данных, объявленный в моем spring_bean_file.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(); 

    }

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

1 Ответ

1 голос
/ 02 марта 2012

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

Аннотации и сканирование 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);

См. также

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...