applicationContext.xml中发生了什么

时间:2012-10-04 20:02:31

标签: spring-mvc jersey entitymanager

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

我的一些问题(并非详尽无遗,因为我真的不太了解):

  • id="dataSource"dataSource关键字,还是我要使用的数据源的名称?例如,如果我的数据源名称是actuall learningRestDS,我是否将dataSource替换为learningRestDS

  • 为什么数据源类名称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;

2 个答案:

答案 0 :(得分:1)

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

p:dataSource-ref="dataSource"

如果您的数据源名为"learningRestDS",则可以使用:

p:dataSource-ref="learningRestDS"

p:dataSource-refDriverManagerDataSource的属性名称(您将在该类中找到setDataSource()方法,用于注入learningRestDS


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

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

1 实际上DriverManagerDataSource只应该用于测试,因为它的表现很差,但从功能的角度来看,它与其他任何DataSource一样好。


更新以回答您的意见。你看到了:

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

这意味着Spring试图向MysqlDataSource的属性driverClassName注入一些东西 - 它没有这样的属性(setter)。这也意味着您引用的应用程序上下文XML文件不完整/不一致/不正确,因为根据您使用DriverManagerDataSource。确保这是Spring使用的文件,如果使用MySQL数据源,则删除driverClassName属性。

答案 1 :(得分: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。