package com.chen.config;

import java.util.Properties;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.interceptor.TransactionInterceptor;
import com.alibaba.druid.pool.DruidDataSource;

/**
 ************************************************************
 * @类名 : DataSourceConfig.java
 *
 * @DESCRIPTION :数据源相关配置
 * @AUTHOR : cgj
 * @DATE : 2017年10月28日
 ************************************************************
 */
@Configuration
@EnableTransactionManagement
@MapperScan(basePackages = { "com.chen.mapper" }, sqlSessionFactoryRef = "sqlSessionFactory")
public class DataSourceConfig {

	/**
	 * 配置数据源
	 * 给其中一个数据源加上@Primary。因为在Spring Boot Jdbc的自动配置过程中,会对于开发者透明地使用dataSource进行一些相关配置,所以当有两个Datasource实现类时,Spring Boot将无法确定使用哪一个。
		当我们不为@Bean指定名字时,Spring会默认使用方法名作为Bean的名字,所以下面两个数据源的名字分别为prodDataSource和devDataSource。
	 * @return
	 */
    @Bean(name = "datasource")
  //配置文件里的属性名是不需要写成spring.datasource.xxx的形式的,写成a.b.c.url也没有问题,只要在配置bean时指定前缀为a.b.c
    @ConfigurationProperties(prefix = "spring.datasource.dev")
    @Primary
    public DataSource testDataSource() {
        return new DruidDataSource();
    }

    @Bean(name = "sqlSessionFactory")
    @Primary
    public SqlSessionFactory testSqlSessionFactory(@Qualifier("datasource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        System.out.println("数据库配置:"+dataSource);
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:sql/*.xml"));
        // 开启驼峰命名转换
        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
        configuration.setMapUnderscoreToCamelCase(true);
        bean.setConfiguration(configuration);
        return bean.getObject();
    }

    /**
	 * 配置事务管理器
	 * @param prodDataSource
	 * @return
	 */
    @Bean(name = "transactionManager")
    @Primary
    public DataSourceTransactionManager testTransactionManager(@Qualifier("datasource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    /**
	 * 配置JdbcTemplate
	 * 在此我们返回的不是JdbcTemplate的实现,而是其实现接口JdbcOperations。
		使用@Qualifier注解指定该注入哪个bean,默认名字为定义该bean的方法名。
	 * @param prodDataSource
	 * @return
	 */
    @Bean(name = "sqlSessionTemplate")
    @Primary
    public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("sqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

    @Bean(name = "txAdvice")
    @Primary
    public TransactionInterceptor transactionInterceptor(PlatformTransactionManager transactionManager) {
        final String PROPAGATION_REQUIRED = "PROPAGATION_REQUIRED,-Exception";
        TransactionInterceptor interceptor = new TransactionInterceptor();
        interceptor.setTransactionManager(transactionManager);
        Properties transactionAttributes = new Properties();
        // TransactionDefinition.PROPAGATION_REQUIRED;
        transactionAttributes.setProperty("insert*", PROPAGATION_REQUIRED);
        transactionAttributes.setProperty("update*", PROPAGATION_REQUIRED);
        transactionAttributes.setProperty("delete*", PROPAGATION_REQUIRED);
        transactionAttributes.setProperty("select*", PROPAGATION_REQUIRED + ",readOnly");
        interceptor.setTransactionAttributes(transactionAttributes);
        return interceptor;
    }

    @Bean
    @Primary
    public BeanNameAutoProxyCreator transactionAutoProxy() {
        BeanNameAutoProxyCreator bapc = new BeanNameAutoProxyCreator();
        bapc.setExposeProxy(true);
        bapc.setBeanNames("*ServiceImpl");
        bapc.setInterceptorNames("txAdvice");
        return bapc;
    }

}
最近下载更多
zolscy  LV12 3月24日
微信网友_6699076084797440  LV7 2023年11月2日
dapeng0011  LV13 2023年6月19日
xiechuang666  LV2 2023年6月14日
2499317615  LV3 2023年4月27日
微信网友_6448703090905088  LV2 2023年4月26日
524109  LV5 2023年4月13日
计算机暴龙战士  LV19 2023年4月2日
admin_z  LV22 2023年3月3日
Demo1111  LV30 2023年2月19日
最近浏览更多
zolscy  LV12 3月24日
暂无贡献等级
guzeguze 3月7日
暂无贡献等级
2429449458  LV2 1月25日
静慧大小姐来啦  LV1 1月5日
qqqtttt  LV1 1月4日
微信网友_6802396587266048 2023年12月31日
暂无贡献等级
lilong007  LV20 2023年12月30日
1318ff 2023年12月30日
暂无贡献等级
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友