现在有如下问题,需要解决
package com.pp.config; import javax.sql.DataSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * 这里配置了两个数据源 */ @Configuration public class DataSourceConfiguration { @Bean(name="mysqlDataSource") public DataSource createMysqlDataSource() { return DataSourceUtil.createMysqlDataSource(); } @Bean(name="oracleDataSource") public DataSource createOracleDataSource() { return DataSourceUtil.createOracleDataSource(); } }
package com.pp.config; import javax.sql.DataSource; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.core.io.ClassPathResource; @Configuration public class MybatisConfiguration { @Primary @Bean(name="mysqlSqlSessionFactory") public SqlSessionFactory createMysqlSqlSessionFactory() throws Exception { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); //这里需要一个dataSource //上面的已经发布了两个dataSource的bean,这里如何把上面发布的mysqlDataSource注入过来 //就像 applicationContext.getBean("mysqlDataSource") 一样,拿到; sqlSessionFactoryBean.setDataSource(dataSource); sqlSessionFactoryBean.setConfigLocation(new ClassPathResource("mybatis-config.xml")); return sqlSessionFactoryBean.getObject(); } @Bean(name="oracleSqlSessionFactory") public SqlSessionFactory createOracleSqlSessionFactory() throws Exception { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); //这里需要一个dataSource //上面的已经发布了两个dataSource的bean,这里如何把上面发布的oracleDataSource注入过来 //就像 applicationContext.getBean("oracleDataSource") 一样,拿到; sqlSessionFactoryBean.setDataSource(dataSource); sqlSessionFactoryBean.setConfigLocation(new ClassPathResource("mybatis-config.xml")); return sqlSessionFactoryBean.getObject(); } }
解决上面注释的问题,有如下三种方法
一:
package com.pp.config; import javax.sql.DataSource; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.core.io.ClassPathResource; @Configuration public class MybatisConfiguration { @Autowired @Qualifier("mysqlDataSource") private DataSource mysqlDataSource; @Autowired @Qualifier("oracleDataSource") private DataSource oracleDataSource; @Primary @Bean(name="mysqlSqlSessionFactory") public SqlSessionFactory createMysqlSqlSessionFactory() throws Exception { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(mysqlDataSource); System.out.println(mysqlDataSource.getConnection().getCatalog()); sqlSessionFactoryBean.setConfigLocation(new ClassPathResource("mybatis-config.xml")); return sqlSessionFactoryBean.getObject(); } @Bean(name="oracleSqlSessionFactory") public SqlSessionFactory createOracleSqlSessionFactory() throws Exception { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(oracleDataSource); System.out.println(oracleDataSource.getConnection().getCatalog()); sqlSessionFactoryBean.setConfigLocation(new ClassPathResource("mybatis-config.xml")); return sqlSessionFactoryBean.getObject(); } }
二:
package com.pp.config; import javax.sql.DataSource; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.core.io.ClassPathResource; @Configuration public class MybatisConfiguration { @Primary @Bean(name="mysqlSqlSessionFactory") public SqlSessionFactory createMysqlSqlSessionFactory(@Qualifier("mysqlDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dataSource); System.out.println(dataSource.getConnection().getCatalog()); sqlSessionFactoryBean.setConfigLocation(new ClassPathResource("mybatis-config.xml")); return sqlSessionFactoryBean.getObject(); } @Bean(name="oracleSqlSessionFactory") public SqlSessionFactory createOracleSqlSessionFactory(@Qualifier("oracleDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dataSource); System.out.println(dataSource.getConnection().getCatalog()); sqlSessionFactoryBean.setConfigLocation(new ClassPathResource("mybatis-config.xml")); return sqlSessionFactoryBean.getObject(); } }
三:(不推荐)
package com.pp.config; import javax.sql.DataSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * 这里配置了两个数据源 */ @Configuration public class DataSourceConfiguration { public static final DataSource mysqlDataSource = DataSourceUtil.createMysqlDataSource(); public static final DataSource oracleDataSource = DataSourceUtil.createOracleDataSource(); @Bean(name="mysqlDataSource") public DataSource createMysqlDataSource() { return mysqlDataSource; } @Bean(name="oracleDataSource") public DataSource createOracleDataSource() { return oracleDataSource; } }
package com.pp.config; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.core.io.ClassPathResource; @Configuration public class MybatisConfiguration { @Primary @Bean(name="mysqlSqlSessionFactory") public SqlSessionFactory createMysqlSqlSessionFactory() throws Exception { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(DataSourceConfiguration.mysqlDataSource); System.out.println(DataSourceConfiguration.mysqlDataSource.getConnection().getCatalog()); sqlSessionFactoryBean.setConfigLocation(new ClassPathResource("mybatis-config.xml")); return sqlSessionFactoryBean.getObject(); } @Bean(name="oracleSqlSessionFactory") public SqlSessionFactory createOracleSqlSessionFactory() throws Exception { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(DataSourceConfiguration.oracleDataSource); System.out.println(DataSourceConfiguration.oracleDataSource.getConnection().getCatalog()); sqlSessionFactoryBean.setConfigLocation(new ClassPathResource("mybatis-config.xml")); return sqlSessionFactoryBean.getObject(); } }
那就不需要在第一个类里面声明public static final的类,直接调用方法获取对象
以上三种方法,推荐使用前面两种,不推荐使用第三种方法