有人请解释以下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;
答案 0 :(得分: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
合同,他们的工作就会一样好 1 。
DataSource
还有许多其他可能的实现,例如dbcp和c3p0连接池库。它们的优点是它们可以与所有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。