Java Spring:将数据库配置从XML文件迁移到注释

Java Spring:将数据库配置从XML文件迁移到注释,java,spring,hibernate,Java,Spring,Hibernate,我正在尝试将我的项目更新为最新版本的Spring、Hibernate等。我现在面临的问题是将数据库配置从旧的XML配置文件迁移到注释(我非常喜欢基于注释的配置)。以下是我的旧配置: <!-- Configure SessionFactory --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <prope

我正在尝试将我的项目更新为最新版本的Spring、Hibernate等。我现在面临的问题是将数据库配置从旧的XML配置文件迁移到注释(我非常喜欢基于注释的配置)。以下是我的旧配置:

<!-- Configure SessionFactory -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
    destroy-method="close">
    <property name="driverClass" value="org.postgresql.Driver" />
    <property name="jdbcUrl" value="jdbc:postgresql://localhost:5432/mydatabase" />
    <property name="user" value="user" />
    <property name="password" value="password" />
</bean>

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource">
        <ref local="dataSource" />
    </property>
    <property name="packagesToScan" value="com.myproject.core.domain" />
    <property name="configLocation">
        <value>/WEB-INF/hibernate.cfg.xml</value>
    </property>
    <property name="configurationClass">
        <value>org.hibernate.cfg.AnnotationConfiguration</value>
    </property>
</bean>

<!-- enable the configuration of transactional behavior based on annotations -->
<tx:annotation-driven transaction-manager="transactionManager" />

<bean id="transactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory">
        <ref local="sessionFactory" />
    </property>
</bean>

<bean
    class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor" />

<!-- END HIBERNATE CONFIG --> 

/WEB-INF/hibernate.cfg.xml
org.hibernate.cfg.AnnotationConfiguration

有人知道如何仅使用注释配置sessionfactory和事务管理器吗?

以下是我对Hibernate 4和spring 3.2的了解: 您需要为您的配置类使用

@Configuration
@EnableTransactionManagement
@PropertySource({ "classpath:application.properties" })
@ComponentScan({ "org.mysample.model" })
public class PersistenceConfig {

    @Autowired
    private Environment env;

    @Bean
    public LocalSessionFactoryBean sessionFactory() {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(restDataSource());
        sessionFactory.setPackagesToScan(new String[] { "org.mysample.model" });
        sessionFactory.setHibernateProperties(hibernateProperties());

          return sessionFactory;
     }

      @Bean
      public DataSource restDataSource() {
         BasicDataSource dataSource = new BasicDataSource();
          dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));
          dataSource.setUrl(env.getProperty("jdbc.url"));
          dataSource.setUsername(env.getProperty("jdbc.username"));
          dataSource.setPassword(env.getProperty("jdbc.password"));
          return dataSource;
       }

       @Bean
       @Autowired
       public HibernateTransactionManager transactionManager(SessionFactory s) {
          HibernateTransactionManager txManager = new HibernateTransactionManager();
          txManager.setSessionFactory(s);
          return txManager;
       }
}
如果需要更多配置,可以通过使用
@Bean
注释来添加它们。这些依赖项包括hibernate core:4.3.5.Final和javassist:3.18.1-GA

更新:
如果您在application.properties文件中定义了一些配置,Spring会自动构造您的数据源和其他配置:

根据Jama的回答,我已经更新了配置,并尝试将其最小化。结果是一个配置类和一个属性文件:

@EnableAutoConfiguration
@ComponentScan
@EnableAspectJAutoProxy
@EnableTransactionManagement
@PropertySource(value = { "classpath:/appcontext/application.properties" })
public class Application {
    @Bean
    @Autowired
    public LocalSessionFactoryBean sessionFactory(DataSource datasource) {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(datasource);
        sessionFactory.setPackagesToScan(new String[] { "org.mysample.model" });

        return sessionFactory;
    }

    @Bean
    @Autowired
    public HibernateTransactionManager transactionManager(SessionFactory sessionFactory) {
        HibernateTransactionManager txManager = new HibernateTransactionManager();
        txManager.setSessionFactory(sessionFactory);
        return txManager;
    }
}
注意:该配置还支持aop

属性文件包含:

#DataSource configuration
spring.datasource.url=jdbc:postgresql://localhost:5432/mydatabase
spring.datasource.username=dbUsername
spring.datasource.password=dbPassword
spring.datasource.driverClassName=org.postgresql.Driver

注意:属性文件位于文件夹“/src/main/resources/appcontext/”中

感谢Jama的快速回复。我尝试尽可能多地使用“约定优先于配置”的范例来最小化配置。我现在发现,通过在属性文件中指定数据源属性,Spring将自动创建数据源bean。所以我不需要再定义它了。sessionFactory和transactionManager有类似的方法吗?数据库属性是用户定义的配置,因此Spring或Hibernate无法神奇地为您查找和创建数据源;)所以,杰玛,我让春天和冬眠变魔术;)。我现在有一个最小的配置,似乎工作得很好(到目前为止)。因为我不确定它是否完全正确,我将把它作为第二个解决方案发布下来。再次感谢您的回答;)太好了!我不知道在查看spring文档后,我还发现了其他属性: