package cn.config;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
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 com.zaxxer.hikari.HikariDataSource;
import javax.sql.DataSource;

/**
 * 配置见数据库 
 */
@Configuration
public class HikariDataSourceConfig implements BeanPostProcessor
{
	/**
     * @Primary 注解默认为第一个数据源
     * 
     * 使用@ConfigurationProperties把配置信息自动封装成实体类使用。其中配置信息可以放在配置文件中或者配置中
     * 从配置文件application.yml中搜索prefix前缀为cn.sam.datasource对应属性的的信息，
     * @Bean注解的方法：会实例化、配置并初始化一个新的对象，这个对象会由spring IoC 容器管理
    */
	@Bean
    @Primary
    @ConfigurationProperties(prefix = "sam.datasource.primary")
    public DataSourceProperties firstDataSourceProperties() {
	    return new DataSourceProperties();
    }
    /**
     *  默认情况下用@Bean注解的方法名作为对象的名字。但是可以用 name属性定义对象的名字pDataSource
     *  在 @Component 注解的类中不能定义 类内依赖的@Bean注解的方法。@Configuration可以。
     *  pDataSource
     */
	@Primary
	@Bean(name = "dataSource")
    @Qualifier("dataSource")
    @ConfigurationProperties("sam.datasource.primary.configuration")
    public DataSource firstDataSource() {
    	HikariDataSource dsh = firstDataSourceProperties()
    			.initializeDataSourceBuilder()
    			.type(HikariDataSource.class)
    			.build();
    	return dsh;
    }
}