使用JNDI获取我的数据源和属性文件的位置

时间:2012-04-19 14:52:43

标签: java spring maven jndi

我想在我的spring mvc应用程序中使用jndi来做两件事:

  1. 数据源设置
  2. 存储我的属性文件的位置,以便我可以在我的代码中进行查找
  3. 我实际上有2个应用程序,1个是弹簧mvc而另一个是弹簧,所以我打算为两者使用相同的jndi设置。

    此外,2个应用程序运行在不同的包含(tomcat和jetty),我以前从未使用过jndi所以我希望我可以在一个位置定义它并让两个应用程序指向同一个jndi文件(假设它是文件)。

    对于#1,我的spring上下文文件中的数据源设置目前是:

    <bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close">
            <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql://localhost/mydb_development"/>
            <property name="username" value="devuser1"/>
            <property name="password" value="123"/>
    
            <property name="maxActive" value="100"/>
            <property name="maxIdle" value="30"/>
            <property name="maxWait" value="1000"/>
            <property name="defaultAutoCommit" value="true"/>
            <property name="removeAbandoned" value="true"/>
            <property name="removeAbandonedTimeout" value="60"/>
    
            <property name="testOnBorrow" value="true"/>
            <property name="validationQuery" value="SELECT 1"/>
    
        </bean>
    

    有人可以告诉我如何解析这个以使用JNDI,困惑,它是一个必须在我的类加载器中的单独文件,还是我在Spring上下文文件中硬编码路径?< /强>

    至于#2,在我的代码中我正在加载一个属于我的类路径的属性文件,如:

    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    InputStream is = classLoader.getResourceAsStream("test.properties");
    

    现在test.properties文件在我的类路径中,所以它开箱即用,但我想知道/理解的是我是否能以某种方式使用jndi来查找属性文件的位置(如果这有意义的话?并且可能没有在我的类路径中使用此文件。

    我做了google周围,我知道在春天我可以使用以下方式拉入jndi:

    <jee:jndi-lookup id="dataSource" jndi-name="jdbc/mysqlDataSource" />
    

    但我不明白的是,具有设置的实际文件在哪里?它可以在我的web.xml文件以外的位置吗? (我的另一个应用程序再次使用spring,但它是一个守护进程,所以它没有web.xml文件)。

    我的目标是能够更改jndi文件的值(如用户名,密码,文件路径),而不是将这些值嵌入到jar中。我希望能够在生产服务器或开发服务器上手动编辑这些文件,然后重新启动容器。

1 个答案:

答案 0 :(得分:2)

我对春天有点生气,但我记得使用过PropertyPlaceHolderConfigurer,比如:

<bean id="propertyPlaceholderConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="ignoreResourceNotFound">
            <value>true</value>
        </property>
        <property name="ignoreUnresolvablePlaceholders">
            <value>true</value>
        </property>
        <property name="locations">
            <list>
                <value>file:path to your file
                </value>
                <value>file:path to another file if needed
                </value>
            </list>
        </property>
    </bean>

然后,您可以直接使用列表中定义的.properties上的值。即如果你有像

这样的财产
db.driver=com.mysql.jdbc.Driver

你可以像

一样使用它
bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close">
        <property name="driverClassName" value="${db.driver}"/>

如果要定义值。

如果您想进一步控制文件,可以在服务器上注册文件本身的路径,然后通过JNDI查找,更改

file:path to your file 

file:${propertiesFilePath}

我很确定您也可以通过正常的JNDI查找按代码查找这些配置属性。