随笔-2  评论-2  文章-0  trackbacks-0
对于不同的数据库存取需求,我们使用JDBC来解决这个问题,对于不同的数据库连接来源需求,Spring则提供了DataSource注入,更换数据库连接来源只要在Bean.xml中修改配置,而不用修改任何一行程序。 

        因应用不同的系统,应用程序可能使用不同的数库据连接来源,但如纯粹的使用JDBC、透过连接池、或是透过JNDI等等,数据库连接来源 的更改是底层的行为,不应影响到上层的业务逻辑,为此,您可以在需要取得连接来源的Bean上保留一个资料来源注入的接口,让依赖的资料来源由该接口注 入。例如我们来写一个简单的

Bean: 
代码: 
package onlyfun.caterpillar; 
                                                                                
import javax.sql.DataSource; 
import java.sql.Connection; 
                                                                                
public class DataBean { 
    private DataSource dataSource; 
                                                                                
    public void setDataSource(DataSource dataSource) { 
        this.dataSource = dataSource; 
    } 
                                                                                
    public void testDataSource() { 
        try { 
            Connection connection = dataSource.getConnection(); 
            if(connection != null) 
                System.out.println("test ok!"); 
        } 
        catch (Exception e) { 
            e.printStackTrace(); 
        } 
    } 



    这是一个简单的测试Spring DataSource注入的程式,我们通过javax.sql.DataSource接口来注入资料来源, Spring提供了org.springframework.jdbc.datasource.DriverManagerDataSource来取得 DataSource,它实现了javax.sql.DataSource,您将之当作一个Bean,之后再注入DataBean中即可, Bean.xml可以这么写: 
代码: 
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd"> 
<beans> 
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
        <property name="driverClassName"> 
            <value>com.mysql.jdbc.Driver</value> 
        </property> 
        <property name="url"> 
            <value>jdbc:mysql://localhost:3306/TestDB</value> 
        </property> 
        <property name="username"> 
            <value>caterpillar</value> 
        </property> 
        <property name="password"> 
            <value>123456</value> 
        </property> 
    </bean> 
                                                                                
    <bean id="dataBean" class="onlyfun.caterpillar.DataBean"> 
        <property name="dataSource"> 
            <ref bean="dataSource"/> 
        </property> 
    </bean> 
</beans> 


    如果您之前只使用spring-core.jar这个类库,您还必须加入spring-dao.jar,
org.springframework.jdbc.datasource.DriverManagerDataSource是包括在这个类库中,如果您 使用的是spring.jar,当中已经包括了,无需加入任何的jar,当然,为了使用JDBC,您必须要有JDBC驱动程序的jar档。 

可以用下面这段程式简单的测试一下: 
代码: 
  BeanDefinitionRegistry reg = new DefaultListableBeanFactory(); 
  XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(reg); 
                                                                                
  reader.loadBeanDefinitions(new ClassPathResource("bean.xml"));; 
                                                                                
  BeanFactory bf = (BeanFactory) reg; 
  DataBean dataBean = (DataBean) bf.getBean("dataBean"); 
  dataBean.testDataSource(); 

   DriverManagerDataSource并没有提供连接池的功能,只能作简单的连接测试,现在假设连接测试没有问题了,您想要换上DBCP以获得连接池的功能,则原程序不用更动,只要改改Bean定义档就可以了: 
代码: 
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd"> 
<beans> 
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
        <property name="driverClassName"> 
            <value>com.mysql.jdbc.Driver</value> 
        </property> 
        <property name="url"> 
            <value>jdbc:mysql://localhost:3306/TestDB</value> 
        </property> 
        <property name="username"> 
            <value>caterpillar</value> 
        </property> 
        <property name="password"> 
            <value>123456</value> 
        </property> 
    </bean> 
    <bean id="dataBean" class="onlyfun.caterpillar.DataBean"> 
        <property name="dataSource"> 
            <ref bean="dataSource"/> 
        </property> 
    </bean> 
</beans> 


    现在我们使用的是org.apache.commons.dbcp.BasicDataSource作为注入的DataSource源,为了使用 DBCP的功能,您必须要将commons-dbcp.jar加入CLASSPATH中,另外您还需要commons-pool.jar与commons -collections.jar,这些都可以在Spring的相依版本中的lib目录下找到。 
    注意到我們在dataSource Bean上宣告了destroy-method,如此可以确保BeanFactory在关闭进也一并关闭BasicDataSource。 

    如果您的Servlet容器提供了JNDI资料源,您也可以简单的换上这个资料源: 
代码: 
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd"> 
<beans> 
    <bean id="dataSource" class="org.springframework.indi.JndiObjectFactoryBean"> 
        <property name="jndiName"> 
            <value>jdbc/TestDB</value> 
        </property> 
    </bean> 
    <bean id="dataBean" class="onlyfun.caterpillar.DataBean"> 
        <property name="dataSource"> 
            <ref bean="dataSource"/> 
        </property> 
    </bean> 
</beans> 

   为了使用org.springframework.indi.JndiObjectFactoryBean,您必须加入spring- context.jar这个类库,jndiName实际上要根据您所设定的JNDI查询名称,您可以在下面这个网址找到有关于Tomcat中JNDI设定 的方式: 
http://www.caterpillar.onlyfun.net/phpBB2/viewtopic.php?t=1354
posted on 2008-04-02 10:37 elite 阅读(1224) 评论(1)  编辑  收藏 所属分类: spring

评论:
# dd[未登录] 2009-04-16 12:46 | dd
ddd  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: