在我的网络应用程序(spring + tomcat)中,下面是applicationContext.xml
。目前,所有数据库信息(username
,password
)都是直接嵌入的。但是现在在我们的应用程序中,服务器会分叉一个新的JVM
实例,而这个新的JVM
实例需要与同一个数据库进行通信。
<bean id="meetingDBSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" p:initialSize="10" p:maxActive="50" p:minIdle="5" p:maxIdle="35" p:driverClassName="com.mysql.jdbc.Driver" p:url="jdbc:mysql://10.0.1.100/warehouse_mon?useLegacyDatetimeCode=false&useUnicode=true&serverTimezone=UTC&" p:username="user" p:password="pass" p:testOnBorrow="true" p:validationQuery="SELECT 1" />> <bean id="appDB" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource"> <ref bean="meetingDBSource" /> </property> </bean>
所以我希望在启动它时将所需信息作为参数传递。现在获取此数据库信息的有尊严的方式是什么?
最初在我的applicationContext.xml
中,我制作了一张地图并在地图中插入了所有数据库信息。使用Spring特殊表达式,我获取了值,然后将它们用于BasicDataSource
初始化。在我的代码中,使用依赖注入我获得了对这个地图的访问权限,然后获得了信息。
但我想应该有更标准的工厂方式。 (或者可能使用context-param
,如果是,如何使用?)
答案 0 :(得分:1)
我这样使用它。
我有一个像这样的database.properties文件。
db.driverClassName=com.mysql.jdbc.Driver
db.connectionUrl=jdbc:mysql://localhost:3306/test
db.username=test
db.password=testpass
sql.use.db.data=false
sql.use.db.test.data=false
然后在applicationContext.xml中我将配置
<!--property place holder bean -->
<bean id="propertyPlaceholder" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/>
<property name="ignoreResourceNotFound" value="false"/>
<property name="locations">
<list>
<value>classpath:/properties/database.properties</value>
</list>
</property>
然后数据源配置如下
<!-- data source bean-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${db.driverClassName}"/>
<property name="url" value="${db.connectionUrl}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
</bean>
您可以使用@Value注释来访问该文件中的属性。
@Value("${sql.use.db.data}")
private String use_data;