application.yml中数据源配置:

#数据库连接  天气数据
spring:  
    datasource:   
            keshangjdbc: 
                   url: jdbc:oracle:thin:@//10.138.16.41:1565/ods
                   username: supplier  
                   password: Neusoft2017
                 #  driver-class-name: oracle.jdbc.driver.OracleDriver  
#数据库连接 客商数据 
            weatherjdbc: 
                  url: jdbc:oracle:thin:@//10.138.16.41:1565/ods
                  username: weather 
                  password: Neusoft2017  
                #  driver-class-name: oracle.jdbc.driver.OracleDriver     

对每中链接写一个配置类,主要是通过aop的方式链接注入到SqlSessionTemplate中,

客商的配置类如下:

package com.neusoft.interf.dataSources;

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.spring work.beans.factory.annotation.Qualifier;
import org.spring work.boot.context.properties.ConfigurationProperties;
import org.spring work.boot.jdbc.DataSourceBuilder;
import org.spring work.context.annotation.Bean;
import org.spring work.context.annotation.Configuration;
import org.spring work.context.annotation.Primary;
import org.spring work.core.io.support.PathMatchingResourcePatternResolver;
import org.spring work.jdbc.datasource.DataSourceTransactionManager;

import com.alibaba.druid.pool.DruidDataSource;

/**
 * @author 
 * @Time:2018年12月19日 上午11:08:35
 * @version 1.0
 */
@Configuration
@MapperScan( Packages = \"com.neusoft.interf.mapper.keShang\", sqlSessionTemplateRef  = \"keShangSqlSessionTemplate\")   //代表扫描的dao层接口,在dao层接口处理前注入数据库连接
public class keShangDataSource {
     @Bean(name = \"keShangData\")
        @ConfigurationProperties(prefix = \"spring.datasource.keshangjdbc\") // application.properteis中对应属性的前缀  

//这里特别注意的是application.properteis中对应属性一定要和DruidDataSource的属性字段一直
        @Primary
        public DataSource keShangData() {
        return new  DruidDataSource();
        }

        @Bean(name = \"keShangSqlSessionFactory\")
        @Primary
        public SqlSessionFactory keShangSqlSessionFactory(@Qualifier(\"keShangData\") DataSource dataSource) throws Exception {
            SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
            bean.setDataSource(dataSource);
            bean.setTypeAliasesPackage(\"com.neusoft.interf.entity\");//对应的实体类文件夹
            bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(\"classpath:mapper/keShang/*. \"));//对应的 文件夹
            return bean.get ();
        }

        @Bean(name = \"keShangTransactionManager\")
        @Primary
        public DataSourceTransactionManager keShangTransactionManager(@Qualifier(\"keShangData\") DataSource dataSource) {
            return new DataSourceTransactionManager(dataSource);
        }

        @Bean(name = \"keShangSqlSessionTemplate\")
        @Primary
        public SqlSessionTemplate keShangSqlSessionTemplate(@Qualifier(\"keShangSqlSessionFactory\") SqlSessionFactory sqlSessionFactory) throws Exception {
            return new SqlSessionTemplate(sqlSessionFactory);
        }


}
天气的配置类如下:

 

package com.neusoft.interf.dataSources;

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.spring work.beans.factory.annotation.Qualifier;
import org.spring work.boot.context.properties.ConfigurationProperties;
import org.spring work.boot.jdbc.DataSourceBuilder;
import org.spring work.context.annotation.Bean;
import org.spring work.context.annotation.Configuration;
import org.spring work.context.annotation.Primary;
import org.spring work.core.io.support.PathMatchingResourcePatternResolver;
import org.spring work.jdbc.datasource.DataSourceTransactionManager;

import com.alibaba.druid.pool.DruidDataSource;

/**
 * @author 
 * @Time:2018年12月19日 上午11:08:35
 * @version 1.0
 */
@Configuration
@MapperScan( Packages = \"com.neusoft.interf.mapper.weather\", sqlSessionTemplateRef  = \"weatherSqlSessionTemplate\")
public class weatherDataSource {
     @Bean(name = \"weatherData\")
        @ConfigurationProperties(prefix = \"spring.datasource.weatherjdbc\") // application.properteis中对应属性的前缀
        public DataSource weatherData() {
         return new  DruidDataSource();
          //  return DataSourceBuilder.create().build();
        }

        @Bean(name = \"weatherSqlSessionFactory\")
        public SqlSessionFactory weatherSqlSessionFactory(@Qualifier(\"weatherData\") DataSource dataSource) throws Exception {
            SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
            bean.setDataSource(dataSource);
            bean.setTypeAliasesPackage(\"com.neusoft.interf.entity\");
            bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(\"classpath:mapper/weather/*. \"));
            return bean.get ();
        }

        @Bean(name = \"weatherTransactionManager\")
        public DataSourceTransactionManager weatherTransactionManager(@Qualifier(\"weatherData\") DataSource dataSource) {
            return new DataSourceTransactionManager(dataSource);
        }

        @Bean(name = \"weatherSqlSessionTemplate\")
        public SqlSessionTemplate weatherSqlSessionTemplate(@Qualifier(\"weatherSqlSessionFactory\") SqlSessionFactory sqlSessionFactory) throws Exception {
            return new SqlSessionTemplate(sqlSessionFactory);
        }


}
如果有多个数据源,配置类中的@Primary只能写在其中一个,否则会报错。

 

此处有一个 技巧:

静态工具类中如果调用,springboot中bean,通过@Autowired引入bean,@PostConstruct注解方法中,把此bean

赋给静态变量

@Autowired
    private DictService dictService;
    @Autowired
    private static DictService dictService1;

    @PostConstruct
    public void init() {
        dictService1 = dictService;
    }

    public static List<Dict> getDictList(String type) {

        Map<String, > dictMap = Maps.newHashMap();
        List<Dict> dicts = null;
        try {

            dicts = dictService1.findAllList();
        } catch (Exception e) {
            e.printStackTrace();
        }
        for (Dict dict : dicts) {
            List<Dict> dictList = (List<Dict>) dictMap.get(dict.getType());
            if (dictList != null) {
                dictList.add(dict);
            } else {
                dictMap.put(dict.getType(), Lists.newArrayList(dict));
            }
        }
        List<Dict> dictList = (List<Dict>) dictMap.get(type);
        if (dictList == null) {
            dictList = Lists.newArrayList();
        }
        return dictList;
    }

}

1.@PostConstruct说明

     被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的inti()方法。被@PostConstruct修饰的方法会在构造函数之后,init()方法之前运行。

2.@PreDestroy说明

     被@PreDestroy修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法。被@PreDestroy修饰的方法会在destroy()方法之后运行,在Servlet被彻底卸载之前。(详见下面的程序实践)

收藏 打印