2021SC@SDUSC
后端engine config部分
体现分布式(双数据源):
//主数据源 ds1数据源
@Primary
@Bean(name = "ds1DataSource")
public DataSource ds1DataSource(@Qualifier("ds1DataSourceProperties") DataSourceProperties dataSourceProperties) {
return dataSourceProperties.initializeDataSourceBuilder().build();
}
// ds2数据源
@Bean(name = "ds2DataSourceProperties")
@ConfigurationProperties(prefix = "spring.datasource.ds2")
public DataSourceProperties ds2DataSourceProperties() {
return new DataSourceProperties();
}
@Bean(name = "ds2DataSource")
public DataSource ds2DataSource(@Qualifier("ds2DataSourceProperties") DataSourceProperties dataSourceProperties) {
return dataSourceProperties.initializeDataSourceBuilder().build();
}
}
@bean注解用法在前面介绍过了,把Bean理解为类的代理或代言人(实际上通过反射、代理来实现的),这样它就能代表类拥有该拥有的东西了。在Spring中,你标识一个@符号,那么Spring就会来看看,并且从这里拿到一个Bean或者给出一个Bean。
又查看了一下源码:
public @interface Bean {
@AliasFor("name")
String[] value() default {};
@AliasFor("value")
String[] name() default {};
/** @deprecated */
@Deprecated
Autowire autowire() default Autowire.NO;
boolean autowireCandidate() default true;
String initMethod() default "";
String destroyMethod() default "(inferred)";
}
建立第一个数据源时:
//主数据源 ds1数据源
@Primary
@Bean(name = "ds1DataSource")
public DataSource ds1DataSource(@Qualifier("ds1DataSourceProperties") DataSourceProperties dataSourceProperties) {
return dataSourceProperties.initializeDataSourceBuilder().build();
}
DataSource 作为一个接口实现,其实可以看作数据源,查看源代码可以发现,其封装了数据库参数,连接数据库,程序中操作DataSource对象即可对数据库进行增删改查操作。
ds2建立方式与ds1相同。
建立好后:
ds1config对第一个数据源进行jpa的相关配置。如下注释:
@Configuration
@EntityScan(basePackages = "cn.edu.sdu.entity.ds1")
//1、实体扫描
//2、实体管理ref
//3、事务管理
@EnableJpaRepositories(
basePackages = "cn.edu.sdu.repository.ds1",
entityManagerFactoryRef = "ds1EntityManagerFactoryBean",
transactionManagerRef = "ds1TransactionManager")
@EnableTransactionManagement
public class Ds1Config {
//第一个数据源,可以不加Qualifier
@Autowired
@Qualifier("ds1DataSource")
private DataSource dataSource;
//jpa其他参数配置
@Autowired
private JpaProperties jpaProperties;
@Autowired
private HibernateProperties hibernateProperties;
//实体管理工厂builder
@Autowired
private EntityManagerFactoryBuilder factoryBuilder;
/**
* 配置第一个实体管理工厂的bean
*/
@Primary
@Bean(name = "ds1EntityManagerFactoryBean")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() {
return factoryBuilder.dataSource(dataSource)
//这一行的目的是加入jpa的其他配置参数比如(ddl-auto: update等)
//当然这个参数配置可以在事务配置的时候也可以
.properties(hibernateProperties.determineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings()))
.packages("cn.edu.sdu.entity.ds1")
.persistenceUnit("ds1PersistenceUnit")
.build();
}
/**
* EntityManager
*/
@Primary
@Bean(name = "ds1EntityManager")
public EntityManager entityManager() {
return Objects.requireNonNull(entityManagerFactoryBean().getObject()).createEntityManager();
}
/**
* jpa事务管理
*/
@Primary
@Bean(name = "ds1TransactionManager")
public JpaTransactionManager transactionManager() {
JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();
jpaTransactionManager.setEntityManagerFactory(entityManagerFactoryBean().getObject());
return jpaTransactionManager;
}
}
第二个数据源:
与第一个源一致。