Java 如何简化在使用Spring数据源的xml文件中添加多个bean的过程

Java 如何简化在使用Spring数据源的xml文件中添加多个bean的过程,java,spring,jdbc,Java,Spring,Jdbc,我正在使用Spring3.0和JDBC,我目前正在为桌面应用程序试用Spring。每次类需要使用在我的spring\u bean\u file.xml上声明的数据源时,我都需要在xml文件中声明它们,并再次在类中初始化它们。 下面是我的xml文件 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <propert

我正在使用Spring3.0和JDBC,我目前正在为桌面应用程序试用Spring。每次类需要使用在我的spring\u bean\u 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>
我想知道是否有更有效的方法。最好的方法是什么,这样我就不需要为每个使用DataSoruce的类添加bean了。提前感谢各位。

您可以使用:

注释和类路径扫描
dataSource
定义仍然需要在XML中,您还需要将
classA
classB
定义替换为简单的:

<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
这种方法的好处是,您根本不需要XML:

new AnnotationConfigApplicationContext(Cfg.class);
另见
  • -关于如何避免声明重复的依赖项(
    dataSource
    实际用作示例)

您到底有什么问题?您可以使用abstract=“true”声明bean模板,并使用parent=“myBean”向每个bean添加公共字段声明。我不想为需要数据源的每个类将每个bean初始化到我的类中,例如ClassA ClassA=(ClassA)context.getBean(“ClassA”);ClassB ClassB=(ClassB)context.getBean(“ClassB”);如果类来自不同的包,我可以声明多个类吗?我尝试了服务/资源方法,但它说元素“context:component scan”的前缀“context”没有绑定。@royjavelosa:您需要定义XML架构名称空间,请参阅我在
context:component scan
@royjavelosa:附近的更新答案,请记住XML命名空间声明并提供真实的包名。@royjavelosa:
ClassPathXmlApplicationContext
在桌面应用程序中很好。不幸的是,您必须以某种方式引用第一个bean。您的方法是可以的,但是考虑强类型版本:<代码> Class类=上下文。
<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
@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;
    }

}
new AnnotationConfigApplicationContext(Cfg.class);