环境:Springboot2.4.13自定义数据源配置@Bean@ConfigurationProperties(prefix="app.datasource")publicDataSourcedataSource(){returnnewFancyDataSource();}配置文件app:datasource:url:"jdbc:h2:mem:mydb"username:"sa"password:"123123"pool-size:30FancyDataSource类有对应的url、username、pool-size属性。SpringBoot还提供了一个名为DataSourceBuilder的实用程序构建器类,可用于创建标准数据源(如果它在类路径上)。构建器可以根据类路径上可用的内容来检测要使用的类。它还会自动检测基于JDBCURL的驱动程序。@Bean@ConfigurationProperties("app.datasource")publicDataSourcedataSource(){returnDataSourceBuilder.create().build();}但是,有一个问题。由于未提供连接池的实际类型,因此自定义数据源的元数据中不会生成任何键,IDE中也无法完成(因为数据源接口不公开任何属性)。此外,如果您碰巧在类路径上有Hikari,则此基本设置不起作用,因为Hikari没有url属性(但有jdbcUrl属性)。在这种情况下,您必须按如下方式重写配置:app:datasource:jdbc-url:"jdbc:mysql://localhost/test"username:"dbuser"password:"dbpass"pool-size:30ok强制数据源type@Bean@ConfigurationProperties("app.datasource")publicHikariDataSourcedataSource(){returnDataSourceBuilder.create().type(HikariDataSource.class).build();}多数据源配置如果需要配置多数据源,同样的技巧可以应用上一节中描述的。但是,您必须将其中一个数据源实例标记为@Primary,因为未来的各种自动配置都希望能够按类型获取一个。如果您创建自己的数据源,自动配置将退出。在以下示例中,我们提供与主数据源上的自动配置完全相同的功能集:@Bean@Primary@ConfigurationProperties("app.datasource.first")publicDataSourcePropertiesfirstDataSourceProperties(){returnnewDataSourceProperties();}@Bean@主@ConfigurationProperties("app.datasource.first.configuration")publicHikariDataSourcefirstDataSource(){returnfirstDataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build();}@Bean@ConfigurationProperties("app.datasource.second")publicBasicDataSourcesecondDataSource(){returnDataSourceBuilder.create().type(BasicDataSource.class).build();}这两个数据源也绑定了高级定制。例如,您可以按如下方式配置它们:app:datasource:first:url:"jdbc:mysql://localhost/first"username:"dbuser"password:"dbpass"configuration:maximum-pool-size:30second:url:"jdbc:mysql://localhost/second"username:"dbuser"password:"dbpass"max-total:30您还可以将相同的概念应用于辅助数据源,如下例所示:@Bean@Primary@配置属性(“app.datasource.first”)build();}@Bean@ConfigurationProperties("app.datasource.second")publicDataSourcePropertysecondDataSourceProperties(){returnnewDataSourceProperties();}@Bean@ConfigurationProperties("app.datasource.second.configuration")publicBasicDataSourcesecondDataSource(){returnsecondDataSourceProperties().initializeDataSourceBuilder().type(BasicDataSource.class).build();}使用SpringDataRepositoriesSpring数据可以创建各种风格的@Repository接口实现,只要在@中包含这些@RepositoriesEnableAutoConfiguration类SpringBoot在同一个包(或子包)中为您处理所有这些。对于许多应用程序,只需将正确的SpringData依赖项放在类路径中即可。用于JPA的spring-boot-starter-data-jpa,用于Mongodb的spring-boot-starter-data-mongodb等。首先,创建一些存储库接口以使用@Entity对象。SpringBoot尝试根据找到的@EnableAutoConfiguration猜测@Repository定义的位置。要获得更多控制,请使用@EnableJpaRepositories注释。将@Entity定义与Spring配置分开SpringBoot尝试根据它找到的@EnableAutoConfiguration猜测@Entity定义的位置。要获得更多控制,您可以使用@EntityScan注释,如以下示例所示:@Configuration(proxyBeanMethods=false)@EnableAutoConfiguration@EntityScan(basePackageClasses=City.class)publicclassApplication{//...}配置JPA属性SpringDataJPA已经提供了一些与供应商无关的配置选项(例如SQL日志记录选项),而SpringBoot将这些选项和Hibernate的一些选项暴露为外部配置属性。其中一些是根据上下文自动检测的,因此您不必设置它们。spring.jpa.hibernate.ddl-auto是一种特殊情况,因为它根据运行时条件具有不同的默认值。如果使用嵌入式数据库,并且没有模式管理器(如Liquibase或Flyway)处理数据源,则默认创建删除。在所有其他情况下,它默认为无。要使用的方言由JPA提供程序检测。如果您更喜欢自己设置方言,请设置spring.jpa.database-platform属性。spring:jpa:hibernate:naming:physical-strategy:"com.example.MyPhysicalNamingStrategy"show-sql:true配置Hibernate命名策略Hibernate使用两种不同的命名策略将名称从对象模型映射到相应的数据库名称。可以设置spring.jpa.hibernate.naming.physical-strategy属性,属性值是类的完全限定名,package+classs。默认情况下,SpringBoot使用SpringPhysicalNamingStrategy来配置物理命名策略。此实现提供与Hibernate4相同的表结构:所有点都替换为下划线,驼峰式大小写也替换为下划线。此外,默认情况下,所有表名均以小写形式生成。例如,电话号码实体映射到电话号码表。如果您的模式需要混合大小写标识符,请定义自定义SpringPhysicalNamingStrategybean,如以下示例所示:默认设置为5,请设置以下属性:spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl或者,您可以配置以下bean@BeanpublicPhysicalNamingStrategyphysicalNamingStrategy(){returnnewPhysicalNamingStrategy();}Impl配置HibernateL2缓存HibernateL2缓存可以为一系列缓存提供程序配置。它不是将Hibernate配置为再次查找缓存提供程序,而是尽可能提供上下文中可用的缓存提供程序。要使用JCache实现此目的,首先确保org.hibernate.HibernateJCache在类路径上可用。然后,添加HibernatePropertiesCustomizerbean,如以下示例所示:@Configuration(proxyBeanMethods=false)publicclassHibernateSecondLevelCacheExample{@BeanpublicHibernatePropertiesCustomizerhibernateSecondLevelCacheCustomizer(JCacheCacheManagercacheManager){return(properties)->properties.put(ConfigSettings.CACHE_MANAGER,cacheManager.getCacheManager());}}使用多个EntityManagerFactories如果您需要将JPA与多个数据源一起使用,您可能需要每个数据源一个EntityManagerFactory。SpringORM中的LocalContainerEntityManagerFactoryBean允许您根据需要配置EntityManagerFactory。您还可以重用JPA属性来绑定每个EntityManagerFactory的设置,如以下示例所示:@Bean@ConfigurationProperties("app.jpa.first")publicJpaPropertiesfirstJpaProperties(){returnnewJpaProperties();}@BeanpublicLocalContainerEntityManagerFactoryBeanfirstEntityManagerFactory(DataSourcefirstDataSource,JpaPropertiesfirstJpaProperties){EntityManagerFactoryBuilderbuilder=createEntityManagerFactoryBuilder(firstJpaProperties);returnbuilder.dataSource(firstDataSource).packages(Order.class).persistenceUnit("firstDs").build();}privateEntityManagerFactoryBuildercreateEntityManagerFactoryBuilder(JpaPropertiesjpaProperties){JpaVendorAdapterjpaVendorAdapter=createJpaVendorAdapter(jpaProperties);returnnewEntityManagerFactoryBuilder(jpaVendorAdapter,jpaProperties.getProperties(),null);}privateJpaVendorAdaptercreateJpaVendorAdapter(JpaPropertiesjpaProperties){//MapJPApropertiesasneededreturnnewHibernateJpaVendorAdapter();}上面的示例使用名为firstDataSource的数据源bean创建了一个EntityManagerFactory。它会扫描与订单在同一包裹中的实体。可以使用该应用程序映射其他JPA属性。将SpringDataRepositories公开为REST端点SpringDataRest可以将Repository实现公开为REST端点,前提是已为应用程序启用了SpringMVC。SpringBoot公开了一组有用的属性(来自Spring.data.rest命名空间)用于自定义RepositoryRestConfiguration。如果需要提供额外的自定义,则应使用RepositoryRestConfiguration。使用
