配置一個數(shù)據(jù)源
- 想要覆蓋默認(rèn)的設(shè)置只需要定義一個你自己的DataSource類型的 @Bean 珊随。Spring Boot提供一個工具構(gòu)建類DataSourceBuilder笔喉,可用來創(chuàng)建一個標(biāo)準(zhǔn)的DataSource(如果它處于classpath下)堡僻,或者僅創(chuàng)建你自己的DataSource观谦,然后將它和在Section 23.7.1, “Third-party configuration”解釋的一系列Environment屬性綁定浩螺。
比如:
@Bean
@ConfigurationProperties(prefix="datasource.mine")
public DataSource dataSource() {
return new FancyDataSource();
}
datasource.mine.jdbcUrl=jdbc:h2:mem:mydb
datasource.mine.user=sa
datasource.mine.poolSize=30
2.配置兩個數(shù)據(jù)源
*創(chuàng)建多個數(shù)據(jù)源和創(chuàng)建第一個工作都是一樣的靴患。如果使用針對JDBC或JPA的默認(rèn)自動配置,你可能想要將其中一個設(shè)置為 @Primary (然后它就能被任何 @Autowired 注入獲纫觥)鸳君。
@Bean
@Primary
@ConfigurationProperties(prefix="datasource.primary")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix="datasource.secondary")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
3.使用Spring Data倉庫
Spring Data可以為你的 @Repository 接口創(chuàng)建各種風(fēng)格的實現(xiàn)。Spring Boot會為你處理所有事情厨幻,只要那些 @Repositories 接口跟你的 @EnableAutoConfiguration 類處于相同的包(或子包)相嵌。
對于很多應(yīng)用來說,你需要做的就是將正確的Spring Data依賴添加到classpath下(對于JPA有一個 spring-boot-starterdata-jpa 况脆,對于Mongodb有一個 spring-boot-starter-data-mongodb )饭宾,創(chuàng)建一些repository接口來處理 @Entity 對象。具體參考JPA sample或Mongodb sample格了。
Spring Boot會基于它找到的 @EnableAutoConfiguration 來嘗試猜測你的 @Repository 定義的位置看铆。想要獲取更多控制,可以使用 @EnableJpaRepositories 注解(來自Spring Data JPA)盛末。
4.從Spring配置分離 @Entity 定義
-
Spring Boot會基于它找到的 @EnableAutoConfiguration 來嘗試猜測你的 @Entity 定義的位置弹惦。想要獲取更多控制,你可以使用 @EntityScan 注解悄但,比如:
@Configuration @EnableAutoConfiguration @EntityScan(basePackageClasses=City.class) public class Application { //... }
5.配置JPA屬性
-
Spring Data JPA已經(jīng)提供了一些獨立的配置選項(比如棠隐,針對SQL日志),并且Spring Boot會暴露它們檐嚣,針對hibernate的外部配置屬性也更多些助泽。最常見的選項如下:
spring.jpa.hibernate.ddl-auto: create-drop spring.jpa.hibernate.naming_strategy: org.hibernate.cfg.ImprovedNamingStrategy spring.jpa.database: H2 spring.jpa.show-sql: true
(由于寬松的數(shù)據(jù)綁定策略,連字符或下劃線作為屬性keys作用應(yīng)該是等效的) ddl-auto 配置是個特殊情況嚎京,它有不同的默認(rèn)設(shè)置嗡贺,這取決于你是否使用一個內(nèi)嵌數(shù)據(jù)庫(create-drop)。當(dāng)本地EntityManagerFactory被創(chuàng)建時鞍帝,所有 spring.jpa.properties.* 屬性都被作為正常的JPA屬性(去掉前綴)傳遞進(jìn)去了诫睬。
6.使用自定義的EntityManagerFactory
- 為了完全控制EntityManagerFactory的配置,你需要添加一個名為 entityManagerFactory 的 @Bean 帕涌。Spring Boot自動配置會根據(jù)是否存在該類型的bean來關(guān)閉它的實體管理器(entity manager)摄凡。
7.使用兩個EntityManagers
- 即使默認(rèn)的EntityManagerFactory工作的很好续徽,你也需要定義一個新的EntityManagerFactory,因為一旦出現(xiàn)第二個該類型的bean架谎,默認(rèn)的將會被關(guān)閉炸宵。為了輕松的實現(xiàn)該操作,你可以使用Spring Boot提供的EntityManagerBuilder谷扣,或者如果你喜歡
的話可以直接使用來自Spring ORM的LocalContainerEntityManagerFactoryBean土全。
示例:
// add two data sources configured as above
@Bean
public LocalContainerEntityManagerFactoryBean customerEntityManagerFactory(
EntityManagerFactoryBuilder builder) {
return builder
.dataSource(customerDataSource())
.packages(Customer.class)
.persistenceUnit("customers")
.build();
}
@Bean
public LocalContainerEntityManagerFactoryBean orderEntityManagerFactory(
EntityManagerFactoryBuilder builder) {
return builder
.dataSource(orderDataSource())
.packages(Order.class)
.persistenceUnit("orders")
.build();
}
- 上面的配置靠自己基本可以運行。想要完成作品你也需要為兩個EntityManagers配置TransactionManagers会涎。其中的一個會被Spring Boot默認(rèn)的JpaTransactionManager獲取裹匙,如果你將它標(biāo)記為 @Primary 。另一個需要顯式注入到一個新實例末秃「乓常或你可以使用一個JTA事物管理器生成它兩個。
8.使用普通的persistence.xml
- Spring不要求使用XML配置JPA提供者(provider)练慕,并且Spring Boot假定你想要充分利用該特性惰匙。如果你傾向于使用 persistence.xml ,那你需要定義你自己的id為'entityManagerFactory'的LocalEntityManagerFactoryBean類型的 @Bean 铃将,并在那設(shè)置持久化單元的名稱项鬼。
9.使用Spring Data JPA和Mongo倉庫
Spring Data JPA和Spring Data Mongo都能自動為你創(chuàng)建Repository實現(xiàn)。如果它們同時出現(xiàn)在classpath下劲阎,你可能需要添加額外的配置來告訴Spring Boot你想要哪個(或兩個)為你創(chuàng)建倉庫绘盟。最明確地方式是使用標(biāo)準(zhǔn)的Spring Data @EnableRepositories ,然后告訴它你的Repository接口的位置(此處即可以是Jpa悯仙,也可以是Mongo龄毡,或者兩者都是)。
這里也有 spring.data.*.repositories.enabled 標(biāo)志锡垄,可用來在外部配置中開啟或關(guān)閉倉庫的自動配置沦零。這在你想關(guān)閉Mongo倉庫,但仍舊使用自動配置的MongoTemplate時非常有用货岭。
相同的障礙和特性也存在于其他自動配置的Spring Data倉庫類型(Elasticsearch, Solr)蠢终。只需要改變對應(yīng)注解的名稱和標(biāo)志。
10.將Spring Data倉庫暴露為REST端點
Spring Data REST能夠?qū)epository的實現(xiàn)暴露為REST端點茴她,只要該應(yīng)用啟用Spring MVC。
Spring Boot暴露一系列來自 spring.data.rest 命名空間的有用屬性來定制化RepositoryRestConfiguration程奠。如果需要提供其他定制丈牢,你可以創(chuàng)建一個繼承自SpringBoot RepositoryRestMvcConfiguration的 @Configuration 類。該類功能和
RepositoryRestMvcConfiguration相同瞄沙,但允許你繼續(xù)使用 spring.data.rest.* 屬性己沛。