0

有人能解释一下以下applicationContext.xml文件在做什么吗?对于更多的上下文,我从http://persistentdesigns.com/wp/jersey-spring-and-jpa/得到它。

我的一些问题(不是详尽的,因为我真的不太了解):

  • Forid="dataSource"dataSource关键字还是我要使用的数据源的名称?例如,如果我的数据源的名称是实际 learningRestDS,我是否替换dataSourcelearningRestDS

  • 为什么是数据源类名org.springframework.jdbc.datasource.DriverManagerDataSource而不是com.mysql.jdbc.jdbc2.optional.MysqlDataSource

applicationConext.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:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
        http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
   <!--  Scan for both Jersey Rest Annotations a -->
   <context:component-scan base-package="com.persistent.rest,com.persistent.service,com.persistent.service.jpa"/>
   <context:annotation-config />
   <tx:annotation-driven />
   <bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource"
    p:driverClassName="com.mysql.jdbc.Driver" p:url="jdbc:mysql://localhost:3306/jpa"
    p:username="user" p:password="password" />

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
    p:dataSource-ref="dataSource" p:jpaVendorAdapter-ref="jpaAdapter">
    <property name="loadTimeWeaver">
        <bean
            class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
    </property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
    p:entityManagerFactory-ref="entityManagerFactory" />
<bean id="jpaAdapter"
    class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
    p:database="MYSQL" p:showSql="true" />

更新:错误:

SEVERE: Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'personService':
Injection of persistence methods failed;
nested exception is org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'entityManagerFactory' defined in class path resource [applicationContext.xml]:
Invocation of init method failed; nested exception is java.lang.AbstractMethodError: 
org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo.getValidationMode()Ljavax/persistence/ValidationMode;
4

2 回答 2

1

"dataSource"是您稍后用来引用该 bean 的任意 bean 名称 (ID):

p:dataSource-ref="dataSource"

如果您的数据源已命名"learningRestDS",您将使用:

p:dataSource-ref="learningRestDS"

p:dataSource-ref是属性的名称(DriverManagerDataSource您将setDataSource()在该类上找到将用于注入的方法learningRestDS


定义数据源时,您可以自由使用任何实现DataSource接口的类(抽象的力量)。此 XML 的作者选择使用 DriverManagerDataSource而不是MysqlDataSource. 只要他们都遵守合同,他们就会工作一样好。DataSource

有许多其他可能的实现DataSource,例如连接池库。它们的优点是它们可以与所有 JDBC 驱动程序/数据库一起使用。

1实际上DriverManagerDataSource应该只用于测试,因为它的性能很差,但从功能的角度来看,它和其他任何DataSource.


更新以回答您的意见。您正在查看:

Invalid property 'driverClassName' of bean class [com.mysql.jdbc.jdbc2.optional.MysqlDataSource]: No property 'driverClassName' found 

这意味着 Spring 尝试将一些东西注入到没有这样的属性(setter)的属性中driverClassNameMysqlDataSource这也意味着您引用的应用程序上下文 XML 文件不完整/不一致/不正确,正如您所使用的那样DriverManagerDataSourcedriverClassName如果使用 MySQL 数据源,请确保这是 Spring 使用的文件并删除属性。

于 2012-10-04T20:12:16.567 回答
1

“dataSource”的 id 只是与 Java bean 实例关联的名称。您可以将其更改为您想要的任何内容,只要您还更新任何指向它的 ref="" 属性即可。

org.springframework.jdbc.datasource.DriverManagerDataSource 类是一个帮助类,它封装了通常与手动实例化 JDBC 连接相关的所有代码。因此,从这个意义上说,您可以将其视为包装器。它采用您提供的属性,即驱动程序类和 url,并使用它们来实例化新连接。

话虽如此,只要 com.mysql.jdbc.jdbc2.optional.MysqlDataSource 实现 java.sql.DataSource 接口,您就可以将其用作替代品。

在生产环境中,您可能会将其替换为池数据源,甚至是 JNDI 配置的连接池。有很多选择,你不会只使用 Spring 的 DriverManagerDataSource。

于 2012-10-04T20:15:50.010 回答