`
knight_black_bob
  • 浏览: 853513 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

spring aop 多数据源

阅读更多

添加夹包 c3p0-0.9.5.jar  mchange-commons-java-0.2.8.jar

 

结构:



 

根绝结构 不同 注入数据源

 

db-config.properties

one.jdbc.driverClass=com.mysql.jdbc.Driver
one.jdbc.url=jdbc:mysql://localhost:3306/fusionweb?useUnicode=true&characterEncoding=utf-8
one.jdbc.user=root
one.jdbc.password=root
one.jdbc.initialPoolSize=5
one.jdbc.minPoolSize=5
one.jdbc.maxPoolSize=20
one.jdbc.checkoutTimeout=20000
one.jdbc.idleConnectionTestPeriod=120
one.jdbc.maxIdleTime=60
one.jdbc.maxStatements=100
one.jdbc.testConnectionOnCheckout=false


two.jdbc.driverClass=com.mysql.jdbc.Driver
two.jdbc.url=jdbc:mysql://localhost:3306/self_help?useUnicode=true&characterEncoding=utf-8
two.jdbc.user=root
two.jdbc.password=root
two.jdbc.initialPoolSize=5
two.jdbc.minPoolSize=5
two.jdbc.maxPoolSize=20
two.jdbc.checkoutTimeout=20000
two.jdbc.idleConnectionTestPeriod=120
two.jdbc.maxIdleTime=60
two.jdbc.maxStatements=100
two.jdbc.testConnectionOnCheckout=false


three.jdbc.driverClass=com.mysql.jdbc.Driver
three.jdbc.url=jdbc:mysql://localhost:3306/fusion_prob?useUnicode=true&characterEncoding=utf-8
three.jdbc.user=root
three.jdbc.password=root
three.jdbc.initialPoolSize=5
three.jdbc.minPoolSize=5
three.jdbc.maxPoolSize=20
three.jdbc.checkoutTimeout=20000
three.jdbc.idleConnectionTestPeriod=120
three.jdbc.maxIdleTime=60
three.jdbc.maxStatements=100
three.jdbc.testConnectionOnCheckout=false



 

 

 

<?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:aop="http://www.springframework.org/schema/aop"  
    xmlns:cache="http://www.springframework.org/schema/cache"  
    xmlns:context="http://www.springframework.org/schema/context"  
    xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:jee="http://www.springframework.org/schema/jee"  
    xmlns:jms="http://www.springframework.org/schema/jms" xmlns:lang="http://www.springframework.org/schema/lang"  
    xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:oxm="http://www.springframework.org/schema/oxm"  
    xmlns:p="http://www.springframework.org/schema/p" xmlns:task="http://www.springframework.org/schema/task"  
    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd    
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd    
    http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-3.1.xsd    
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd    
    http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd    
    http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.1.xsd    
    http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-3.1.xsd    
    http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-3.1.xsd    
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd    
    http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-3.1.xsd    
    http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.1.xsd    
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd    
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd"
	>
  
	 <context:annotation-config />
  <aop:aspectj-autoproxy />
  <context:component-scan base-package="com">
		<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
	</context:component-scan>
	 
	 
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
        <property name="locations">  
            <list>  
                <value>classpath:db-config.properties</value>  
            </list>  
        </property>  
    </bean>  
  
    <bean id="dataSourceOne" class="com.mchange.v2.c3p0.ComboPooledDataSource"  
        destroy-method="close">  
       <property name="driverClass" value="${one.jdbc.driverClass}" />
		<property name="jdbcUrl" value="${one.jdbc.url}" />
		<property name="user" value="${one.jdbc.user}" />
		<property name="password" value="${one.jdbc.password}" />
		<property name="initialPoolSize" value="${one.jdbc.initialPoolSize}" />
		<property name="minPoolSize" value="${one.jdbc.minPoolSize}" />
		<property name="maxPoolSize" value="${one.jdbc.maxPoolSize}" />
		<property name="checkoutTimeout" value="${one.jdbc.checkoutTimeout}" />
		<property name="idleConnectionTestPeriod" value="${one.jdbc.idleConnectionTestPeriod}" />
		<property name="maxIdleTime" value="${one.jdbc.maxIdleTime}" />
		<property name="maxStatements" value="${one.jdbc.maxStatements}" />
		<property name="testConnectionOnCheckout" value="${one.jdbc.testConnectionOnCheckout}" /> 
    </bean>  
  
    <bean id="dataSourceTwo" class="com.mchange.v2.c3p0.ComboPooledDataSource"  
        destroy-method="close">  
        <property name="driverClass" value="${two.jdbc.driverClass}" />
		<property name="jdbcUrl" value="${two.jdbc.url}" />
		<property name="user" value="${two.jdbc.user}" /> 	
		<property name="password" value="${two.jdbc.password}" />
		<property name="initialPoolSize" value="${two.jdbc.initialPoolSize}" />
		<property name="minPoolSize" value="${two.jdbc.minPoolSize}" />
		<property name="maxPoolSize" value="${two.jdbc.maxPoolSize}" />
		<property name="checkoutTimeout" value="${two.jdbc.checkoutTimeout}" />
		<property name="idleConnectionTestPeriod" value="${two.jdbc.idleConnectionTestPeriod}" />
		<property name="maxIdleTime" value="${two.jdbc.maxIdleTime}" />
		<property name="maxStatements" value="${two.jdbc.maxStatements}" />
		<property name="testConnectionOnCheckout" value="${two.jdbc.testConnectionOnCheckout}" /> 
    </bean> 
    
     <bean id="dataSourceThree" class="com.mchange.v2.c3p0.ComboPooledDataSource"  
        destroy-method="close">  
       <property name="driverClass" value="${three.jdbc.driverClass}" />
		<property name="jdbcUrl" value="${three.jdbc.url}" />
		<property name="user" value="${three.jdbc.user}" />
		<property name="password" value="${three.jdbc.password}" />
		<property name="initialPoolSize" value="${three.jdbc.initialPoolSize}" />
		<property name="minPoolSize" value="${three.jdbc.minPoolSize}" />
		<property name="maxPoolSize" value="${three.jdbc.maxPoolSize}" />
		<property name="checkoutTimeout" value="${three.jdbc.checkoutTimeout}" />
		<property name="idleConnectionTestPeriod" value="${three.jdbc.idleConnectionTestPeriod}" />
		<property name="maxIdleTime" value="${three.jdbc.maxIdleTime}" />
		<property name="maxStatements" value="${three.jdbc.maxStatements}" />
		<property name="testConnectionOnCheckout" value="${three.jdbc.testConnectionOnCheckout}" /> 
    </bean>   
  
   
  
    
  <bean id="dataSourceInterceptor" class="com.commons.dynamictasource.DataSourceInterceptor" />
  
    <aop:config>  
        <aop:aspect id="dataSourceAspect" ref="dataSourceInterceptor">  
            <aop:pointcut id="daoOne" expression="execution(* com.onweb.*.*(..))" />  
            <aop:pointcut id="daoTwo" expression="execution(* com.twoweb.*.*(..))" />  
            <aop:pointcut id="daoThree" expression="execution(* com.threeweb.*.*(..))" />  
            <aop:before pointcut-ref="daoOne" method="setdataSourceOne" />  
            <aop:before pointcut-ref="daoTwo" method="setdataSourceTwo" />  
             <aop:before pointcut-ref="daoThree" method="setdataSourceThree" />  
        </aop:aspect>  
    </aop:config>  
     
     
      <bean id="dataSource" class="com.commons.dynamictasource.DynamicDataSource">  
        <property name="targetDataSources">  
            <map key-type="java.lang.String">  
                <entry value-ref="dataSourceOne" key="dataSourceOne"></entry>  
                <entry value-ref="dataSourceTwo" key="dataSourceTwo"></entry>  
                <entry value-ref="dataSourceThree" key="dataSourceThree"></entry>  
            </map>  
        </property>  
        <property name="defaultTargetDataSource" ref="dataSourceOne">  
        </property>  
    </bean>  
</beans>   

 

package com.commons.dynamictasource;

public class DatabaseContextHolder {

	private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();  
	  
    public static void setCustomerType(String customerType) { 
        contextHolder.set(customerType);  
    }  
  
    public static String getCustomerType() {  
        return contextHolder.get();  
    }  
  
    public static void clearCustomerType() {  
        contextHolder.remove();  
    }  
	    
}

 

package com.commons.dynamictasource;

import org.aspectj.lang.JoinPoint;
import org.springframework.stereotype.Component;

@Component  
public class DataSourceInterceptor {  
  
    public void setdataSourceOne(JoinPoint jp) {  
        DatabaseContextHolder.setCustomerType("dataSourceOne");  
    }  
      
    public void setdataSourceTwo(JoinPoint jp) {  
        DatabaseContextHolder.setCustomerType("dataSourceTwo");  
    }  
    
    public void setdataSourceThree(JoinPoint jp) {  
        DatabaseContextHolder.setCustomerType("dataSourceThree");  
    } 
}  

 

package com.commons.dynamictasource;

import java.sql.SQLFeatureNotSupportedException;
import java.util.logging.Logger;
 

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
 

public class DynamicDataSource  extends AbstractRoutingDataSource{  
  
	  
    @Override  
    protected Object determineCurrentLookupKey() {   
        return DatabaseContextHolder.getCustomerType();   
    }

	@Override
	public Logger getParentLogger() throws SQLFeatureNotSupportedException { 
		return null;
	}

	 
  
}  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

捐助开发者

在兴趣的驱动下,写一个免费的东西,有欣喜,也还有汗水,希望你喜欢我的作品,同时也能支持一下。 当然,有钱捧个钱场(右上角的爱心标志,支持支付宝和PayPal捐助),没钱捧个人场,谢谢各位。



 
 
 谢谢您的赞助,我会做的更好!

 

 

  • 大小: 8.8 KB
0
1
分享到:
评论
2 楼 knight_black_bob 2015-11-02  
jinxiuwei 写道
能把工程发我一份么,jinxiuwei.1988@163.com,学习一下谢谢

http://download.csdn.net/download/knight_black_bob/9233289
1 楼 jinxiuwei 2015-10-29  
能把工程发我一份么,jinxiuwei.1988@163.com,学习一下谢谢

相关推荐

    springAop多数据源

    总结来说,"springAop多数据源"项目涉及到Spring框架的多数据源配置、JdbcTemplate的使用、面向切面编程的应用,以及使用JUnit进行测试。理解并掌握这些技术对于构建灵活、可扩展的Java应用程序至关重要。在实践中,...

    spring boot AOP注解方式实现多数据源

    在Spring Boot中,AOP(面向切面编程)和多数据源的整合是常见的应用场景,尤其是在大型企业级项目中,为了实现数据的隔离或者优化数据库访问,常常需要配置多个数据源。本文将深入探讨如何使用Spring Boot的AOP注解...

    springboot-AOP实现多数据源动态切换(Druid连接池)

    在Spring Boot项目中实现多数据源动态切换是一项高级特性,能够使应用根据不同业务需求访问不同的数据库,从而实现服务的解耦和数据库操作的优化。该技术的关键在于如何在同一个应用中配置和使用多个数据源,以及...

    springboot实现多数据源而且加上事务不会使aop切换数据源失效

    本示例主要讲解如何使用Spring Boot结合MyBatis实现多数据源切换,并确保AOP事务管理仍然有效。 首先,我们需要配置多数据源。在Spring Boot中,可以使用`DataSource`接口的实现类,如`HikariCP`或`Druid`,创建两...

    spring boot多数据源(AOP注解动态切换)

    本教程将详细讲解如何在Spring Boot项目中集成Druid连接池,并利用AOP注解实现多数据源的动态切换。我们将基于JDK 1.8和Spring Boot 1.5.14版本进行讨论。 首先,我们需要理解Spring Boot的自动配置特性。Spring ...

    springaop多数据库读写分离

    1. **配置数据源**:首先,我们需要配置多个数据源,一个作为主库(处理写操作),另一个或多个作为从库(处理读操作)。这可以通过Spring的`AbstractRoutingDataSource`实现,这个类可以根据一定的规则动态选择合适...

    Spring+SpringMvc+MybatisPlus+Aop(自定义注解)动态切换数据源

    本项目“Spring+SpringMvc+MybatisPlus+Aop(自定义注解)动态切换数据源”正是针对这一需求提供的一种解决方案。下面将详细介绍这个项目中的关键技术点和实现原理。 首先,Spring框架是Java企业级应用开发的核心...

    切换spring数据源的工具,使用aop注解方式进行快速切换,减少编码的入侵

    基于Spring的 AbstractRoutingDataSource 进行简单的封装,方便进行数据源的切换,目前主要用于主从数据库的读写切换上。切换spring数据源的工具,使用aop注解方式进行快速切换,减少编码的入侵

    Springcloud 多数库 多数据源整合,查询动态切换数据库

    2. **动态切换数据源**:在Spring框架中,我们可以利用AOP(面向切面编程)和ThreadLocal来实现数据源的动态切换。创建一个自定义的数据源切换注解,比如`@SwitchDataSource`,并在需要切换数据源的方法上使用。通过...

    Spring AOP配置事务方法

    在 Spring AOP 中,我们可以使用 JNDI(Java Naming and Directory Interface,Java 命名和目录接口)来查找数据源。在上面的配置文件中,我们可以看到 `&lt;bean&gt;` 元素用于定义一个名为 "sgis.sdk.dataSource" 的数据...

    java spring 多数据源

    在Java Spring框架中,多数据源的实现是一个重要的特性,特别是在大型企业级应用中,它允许应用程序连接到多个数据库,从而实现数据隔离、负载均衡或读写分离等高级功能。本教程将深入探讨如何在Spring中配置和管理...

    spring 动态多数据源配置代码

    下面将详细介绍Spring动态多数据源配置的相关知识点。 1. **为什么要使用多数据源**: 在实际项目中,可能需要连接到不同的数据库,例如,一个用于存储主业务数据,另一个用于日志记录或数据分析。通过多数据源...

    spring mybatis 多数据源动态切换

    Spring 和 MyBatis 结合使用时,实现多数据源动态切换是一项重要的技术。本文将深入探讨如何在 Spring 中配置和管理多个数据源,并实现动态切换。 首先,我们需要理解“多数据源”是什么。它是指在一个应用中同时...

    spring4 AOP 源代码

    Spring 4 框架是Java开发中广泛使用的轻量级框架,它的核心特性包括依赖注入(DI)、面向切面编程(AOP)以及一系列的其他功能,如数据访问、Web MVC、测试等。AOP作为Spring的重要组成部分,允许开发者在不修改原有...

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

    Spring Boot结合JPA(Java Persistence API)和JdbcTemplate,为开发者提供了灵活且强大的多数据源配置能力。本示例将详细介绍如何在Spring Boot项目中实现这样的配置,以支持不同类型的数据库。 首先,我们要理解...

    spring动态选择数据源

    本篇文章将探讨“Spring动态选择数据源”这一主题,它允许我们的应用程序根据业务需求在多个数据源之间灵活切换,这在多租户、读写分离等场景下尤其重要。 首先,理解“数据源”在Spring中的概念。数据源...

    SSM(Spring+SpringMVC+MyBatis)多数据源配置框架

    在多数据源配置中,Spring能够帮助管理不同的数据源,通过配置bean来切换和控制数据源的使用。 **SpringMVC** 是Spring框架的一部分,专为Web开发设计。它简化了模型-视图-控制器(Model-View-Controller,MVC)的...

    spring boot 多数据源项目

    5. **AOP切面**:通过Spring的AOP(面向切面编程)特性,可以编写一个切面来实现数据源的选择逻辑。通常,我们可以在方法执行前动态设置ThreadLocal变量,从而在同一个线程内的后续数据库操作中自动选择正确的数据源...

    spring多数据源

    在许多实际项目中,我们可能需要连接并操作多个数据库,比如主从数据库、读写分离、不同环境的数据隔离等,这时就需要用到Spring的多数据源支持。 Spring多数据源允许我们在一个应用中同时管理多个数据库连接,通过...

Global site tag (gtag.js) - Google Analytics