`
envoydada
  • 浏览: 64882 次
社区版块
存档分类
最新评论

Spring DataSource注入

阅读更多
DataSource注入 <o:p></o:p>

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

<o:p></o:p>

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

DataBean.java <o:p></o:p>

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定义档可以这么撰写: <o:p></o:p>

<!---->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 

        
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檔。

可以用下面这段程序简单的测试一下: <o:p></o:p>

BeanDefinitionRegistry reg = new DefaultListableBeanFactory(); <o:p></o:p>

XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(reg); <o:p></o:p>

                                                                                 <o:p></o:p>

reader.loadBeanDefinitions(new ClassPathResource("bean.xml"));; <o:p></o:p>

                                                                                <o:p></o:p>

BeanFactory bf = (BeanFactory) reg; <o:p></o:p>

DataBean dataBean = (DataBean) bf.getBean("dataBean"); <o:p></o:p>

dataBean.testDataSource();<o:p></o:p>


DriverManagerDataSource并没有提供连接池的功能,只能作作简单的单机连接测试,现在假设连接测试没有问题了,您想要换上DBCP以获得连接池的功能,则原程序不用更动,只要改改Bean定义档就可以了: <o:p></o:p>

<!---->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 

        
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。

如果您要直接使用JDBC来进行数据存储,使用org.springframework.jdbc.datasource.DataSourceUtils来取得Connection会是更好的方式: <o:p></o:p>

Connection conn = DataSourceUtils.getConnection(dataSource);<o:p></o:p>


这样作的好处是,所有的SQLException都被Spring的DataAccessException子类CannotGetJdbcConnectionException包装起来。您可以获得更多的信息,并保证存储层的可移值性。


关闭Connection时,可以用下面的方式: <o:p></o:p>

DataSourceUtils.closeConnectionIfNecessry(connection, dataSource);<o:p></o:p>


如果您的Servlet容器提供了JNDI资料源,您也可以简单的换上这个数据源: <o:p></o:p>

 

<o:p></o:p>

<!---->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查询名称

分享到:
评论

相关推荐

    SpringBoot框架Datasource注入

    在Spring Boot框架中,`DataSource`的注入是应用程序与数据库交互的基础。`DataSource`是一个接口,通常由诸如HikariCP、Druid或Tomcat JDBC等实现提供,它负责存储和管理数据库连接,使得我们的应用能够高效且安全...

    spring中dataSource的配置以及配合IOC的使用

    当需要数据库连接时,Spring会自动注入`DataSource`到需要它的组件中,通过`@Autowired`注解实现依赖注入。 ```java @Service public class UserService { @Autowired private DataSource dataSource; // 使用...

    spring的setter注入实现mysql数据库的连接

    `@Autowired`注解用于setter方法,Spring会自动将配置的DataSource注入进来。 最后,我们可以编写一个Controller类来处理HTTP请求,并调用UserRepository来执行数据库操作: ```java @RestController @...

    spring配置datasource(dbcp方式)

    在Spring框架中,数据源(DataSource)是连接数据库的关键组件,它管理数据库连接的创建、分配和释放。DBCP(Basic Database Connection Pool)是Apache提供的一款开源的数据库连接池实现,它为Java应用提供了高效的...

    Spring 三种依赖注入方式.doc

    Spring 框架中提供了多种依赖注入方式,其中最常用的三种依赖注入方式分别是接口注入、设值注入和构造函数注入。下面,我们将分别对这三种依赖注入方式进行详细的介绍和分析。 一、接口注入 接口注入是指通过接口...

    第五章 Spring4 自动装配、方法注入

    例如,如果你有一个名为"dataSource"的bean定义,并且你的另一个bean需要一个DataSource类型的属性,Spring可以通过byType自动装配,将"dataSource"注入到该属性中。这大大减少了手动配置的工作量。 接下来,我们...

    学习Spring笔记_DataSource

    Spring提供的这两个模板类简化了数据库操作,它们与DataSource结合使用,可以实现无侵入式的数据库访问,降低了SQL注入的风险。 通过阅读《学习Spring笔记_DataSource》这篇博文,可以深入理解Spring框架如何管理...

    spring jdbcTemplate 注入到servlet

    本篇文章将深入探讨`Spring JdbcTemplate`的注入以及如何在Servlet中使用它。 首先,让我们了解一下`JdbcTemplate`的基本概念。`JdbcTemplate`的核心功能包括:执行SQL查询、更新、调用存储过程等,同时提供了一套...

    spring注入文件写法

    在Spring框架中,注入是一种将依赖关系从代码中解耦并允许对象在运行时自动配置的方法。本示例主要展示了如何使用Spring配置文件来实现数据源、Hibernate会话工厂、事务管理和DAO注入。以下是详细的知识点解析: 1....

    spring+druid+AtomikosDataSource实现多数据源切换及分布式事务控制

    Spring框架因其强大的依赖注入和AOP(面向切面编程)特性,成为Java领域首选的轻量级框架。Druid是一个优秀的数据库连接池组件,而AtomikosDataSource则是处理分布式事务的重要工具。下面我们将详细探讨如何利用...

    MyBatis 基于Mapper的增删改查示例(Spring IOC注入)

    要在Spring中使用MyBatis,首先需要在Spring配置文件中定义DataSource、SqlSessionFactoryBean以及MapperScannerConfigurer。DataSource配置数据源,SqlSessionFactoryBean配置SqlSessionFactory,...

    16. Spring Boot使用Druid(编程注入)【从零开始学Spring Boot】

    在本篇【从零开始学Spring Boot】系列中,我们将探讨如何在Spring Boot项目中使用Druid数据源进行编程注入。Druid是一个优秀的数据库连接池,它提供了强大的监控和扩展功能,是许多企业级应用首选的数据源解决方案。...

    干净的spring初始化工程,包含ioc,di,datasource,但是不包含aop

    Spring框架是Java开发中广泛应用的一个轻量级框架,它提供了许多关键特性,如依赖注入(Dependency Injection,简称DI)、面向切面编程(Aspect-Oriented Programming,简称AOP)以及控制反转(Inversion of Control...

    Dynamic datasource, multipl-SpringBoot-DynamicDataSource.zip

    这通常涉及到在业务逻辑中注入`DataSource`并调用其`determineCurrentLookupKey`方法。 5. **事务管理**:在多数据源环境下,事务管理也需要特殊处理。项目可能展示了如何配置`PlatformTransactionManager`来适配...

    dynamic-datasource-spring-boot-starter-master.zip

    这个压缩包"dynamic-datasource-spring-boot-starter-master.zip"提供了一个快速启动的解决方案,使得开发者能够便捷地在SpringBoot应用中配置和管理多个数据源。 首先,我们要理解什么是SpringBoot。SpringBoot是...

    multiple-datasource-app.zip

    `multiple-datasource-app.zip` 包含了一个利用Spring Boot和特定技术实现多数据源配置的示例。在这个项目中,主要涉及的关键技术是`AbstractRoutingDataSource` 和 AOP(面向切面编程)。 首先,`...

    Spring学习笔记(10)----公共属性的注入配置

    在Spring框架的学习中,公共属性的注入配置是一个重要的概念,它可以帮助我们实现代码的复用,提高开发效率。本文将详细解析Spring中的公共属性注入配置,并通过实例来深入理解其工作原理。 首先,我们需要理解什么...

    Spring Boot+Jpa多数据源配置Demo(支持不同数据库)

    在Spring Boot中,我们可以通过创建不同的`DataSource` bean来配置多个数据源。每个数据源通常会有一个对应的`JdbcTemplate`或`JpaEntityManagerFactory`。首先,我们需要在`application.yml`或`application....

    spring-boot-starter-mybatis-spring-boot-1.0.2.zip

    Spring Boot会自动扫描项目中的Mapper接口,并通过MyBatis-Spring将它们注入到需要的地方,无需手动配置。这样,你就可以在Service层直接注入Mapper接口并调用其方法执行SQL操作。 5. 性能优化 在实际项目中,可以...

Global site tag (gtag.js) - Google Analytics