foo.datasource.url=jdbc:h2:mem:foo
foo.datasource.username=sa
foo.datasource.password=
bar.datasource.url=jdbc:h2:mem:bar
bar.datasource.username=sa
bar.datasource.password=
package com.cocabit.spring;
import javax.annotation.Resource;
import javax.sql.DataSource;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import lombok.extern.slf4j.Slf4j;
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class, JdbcTemplateAutoConfiguration.class })
@Slf4j
public class MutiDataSourceDemoApplication {
public static void main(String[] args) {
SpringApplication.run(MutiDataSourceDemoApplication.class, args);
}
@Bean
@ConfigurationProperties("foo.datasource")
public DataSourceProperties fooDataSourceProperties() {
return new DataSourceProperties();
}
@Bean
public DataSource fooDataSource() {
DataSourceProperties dataSourceProperties = fooDataSourceProperties();
log.info("foo datasource:{}", dataSourceProperties.getUrl());
return dataSourceProperties.initializeDataSourceBuilder().build();
}
@Bean
@Resource
public PlatformTransactionManager fooTxManager(DataSource fooDataSource) {
return new DataSourceTransactionManager(fooDataSource);
}
@Bean
@ConfigurationProperties("bar.datasource")
public DataSourceProperties barDataSourceProperties() {
return new DataSourceProperties();
}
@Bean
public DataSource barDataSource() {
DataSourceProperties dataSourceProperties = barDataSourceProperties();
log.info("bar datasource:{}", dataSourceProperties.getUrl());
return dataSourceProperties.initializeDataSourceBuilder().build();
}
@Bean
@Resource
public PlatformTransactionManager barTxManager(DataSource barDataSource) {
return new DataSourceTransactionManager(barDataSource);
}
}
POJO(Plain Ordinary Java Object)or(Plain Old Java Object)简单的JAVA对象。
划重点“简单”,到底是多简单呢?
public class Student {
private String nameString;
public String getNameString() {
return nameString;
}
public void setNameString(String nameString) {
this.nameString = nameString;
}
}
就是这么简单,只有private属性外加get set。木有实现接口,木有继承,木有构造函数,木有业务逻辑,就是这么的纯粹。
是不是很眼熟,很像与数据库表对应的类?是的,所以呢,它又被称为“Data对象”
JAVABean = POJO+无参数构造函数+可序列化
import java.io.Serializable;
public class Student implements Serializable{
private static final long serialVersionUID = 1L;
private String nameString;
public String getNameString() {
return nameString;
}
public void setNameString(String nameString) {
this.nameString = nameString;
}
public Student() {
}
}
如果不仅仅在内存中使用,而且需要在网络中传输,需要保存下来,那么就需要序列化。
SpringBean
long long ago,Spring是用来设计管理JavaBean的,所以Spring管理的对象也是Bean。现在Spring可以管理任何对象了。什么叫任何,就是包括JavaBean,还有那么没有private或者没有默认构造函数,或者没有get set方法的对象。
受Spring容器管理的对象 = SpringBean = JavaBean + 不是JavaBean的对象
@Bean
加在方法上的@Bean表示,这个方法要返回一个 对象 了昂,Spring容器你给我管好了。
DataSourceAutoConfiguration.class | DataSourceProperties |
DataSourceTransactionManagerAutoConfiguration.class | PlatformTransactionManager |
JdbcTemplateAutoConfiguration.class | DataSource |
将同类的配置信息自动封装成实体类
从两方面来理解这个注释
①配置信息,很显然此处的foo.datasource是配置的一个键值,只是用来区分datasource而已,只要在@ConfigurationProperties写明你要封装哪个配置就好了。
②同类=与类相匹配
此处是与什么类相匹配呢?显而易见是DataSourceProperties。那这个类里面有什么呢?Ctrl+鼠标左键单击,去看看这个类。
你就会发现,url,username,password赫然在列。还有别的一些属性,例如name,driverClassName
让我们大胆的推测一下,是不是在配置文件中添加
foo.datasource.name = kuangniaokuang
然后通过注释,也能一下get到name值呢。你猜对了。
是不是很神奇,就这么biubiu一下,就把配置文件的值,放到了一个实体类中了。