2014-03-31 53 views
1

我正在使用spring jdbc进行数据库连接。每次运行我的测试java类spring时,上下文也会每次加载。任何建议?为什么每次都加载spring应用上下文

我的代码片断低于,

appContext.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:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation=" 
      http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-2.0.xsd 
      http://www.springframework.org/schema/context 
      http://www.springframework.org/schema/beans/spring-context-2.0.xsd "> 

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 
     <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
     <property name="url" value="jdbc:mysql://localhost:3306/3i" /> 
     <property name="username" value="xxx" /> 
     <property name="password" value="xxx" /> 
    </bean> 

    <bean id="jdbcTemp" class="org.springframework.jdbc.core.JdbcTemplate"> 
     <property name="dataSource" ref="dataSource"> 
     </property> 
    </bean> 
</beans> 

Java类:

package com.pinovus.dbconnection; 

import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 
import org.springframework.jdbc.core.JdbcTemplate; 

public class DbDao { 

    private static JdbcTemplate jdbctemplate; 
    private static ApplicationContext appcontext; 

    public JdbcTemplate getJdbctemplate() { 

     ApplicationContext cx = new ClassPathXmlApplicationContext(
       "appContext.xml"); 
     jdbctemplate = (JdbcTemplate) cx.getBean("jdbcTemp"); 
     return jdbctemplate; 
    } 

    public void setJdbctemplate(JdbcTemplate jdbctemplate) { 
     this.jdbctemplate = jdbctemplate; 
    } 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 

    } 

} 

和测试Java类:

package com.pinovus.dbconnection; 

import org.springframework.jdbc.core.JdbcTemplate; 
import org.springframework.jdbc.support.rowset.SqlRowSet; 

public class test { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     JdbcTemplate jt = new DbDao().getJdbctemplate(); 
     String qry = "select role from accounts"; 
     SqlRowSet rs = jt.queryForRowSet(qry); 
     while (rs.next()) { 
      System.out.println(rs.getString(1)); 
     } 
    } 
} 
+0

您正在调用每次加载spring上下文的'getJdbctemplate()'。你想要它做什么? – jervine10

+0

现在我明白了它的代码问题,每次我调用getJdbctemplate()方法 – jasim

回答

1

你的DAO不应该知道的应用程序上下文,不应该明确它仰视的东西。你可以把它改写使用the Spring documentation为例:

public class DbDaoImpl implements DbDao { 

    private JdbcTemplate jdbcTemplate; 

    public void setDataSource(DataSource dataSource) { 
     this.jdbcTemplate = new JdbcTemplate(dataSource); 
    }  
    ... 
} 

,你可以删除应用程序上下文XML的jdbcTemp条目。取而代之的是使DAO Spring管理,为它创建一个条目,如下所示:

<bean id="dbDao" class="DbDaoImpl"> 
    <property name="dataSource" ref="dataSource"/> 
</bean> 
+0

感谢您的答案,但我必须这样做用DriverManager – jasim

+0

@jasim:??我没有说不使用DriverManager。让你的Dao成为一个春季管理的豆子。 –

0

这是因为你创造新的我nstance每次:

new DbDao().getJdbctemplate(); 

,并进一步:

new ClassPathXmlApplicationContext("appContext.xml"); 

这不是春天的一个问题。这取决于你的设计。

我不知道该如何帮助你,因为它只是正确的Java代码:无论如何,在public static void main(String[] args)的情况下,你必须实例化对象来处理它们。

请提供更多信息哪里都是你的疑惑

+0

好了,现在我明白了问题,如何在每次运行程序时加载弹簧上下文 – jasim

+0

对不起:您对Java有多少了解?当运行程序('java com.pinovus.dbconnection.test')每次它不仅创建上下文,但甚至启动JVM –

+0

对不起我的愚蠢问题,我必须学习更多 – jasim

相关问题