日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

Spring Data JPA 从入门到精通~默认数据源的讲解

發(fā)布時(shí)間:2024/7/23 javascript 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring Data JPA 从入门到精通~默认数据源的讲解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

默認(rèn)數(shù)據(jù)源

spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?useSSL=false spring.datasource.username=root spring.datasource.password=123456

但是在實(shí)際工作中不可能這么簡(jiǎn)單,因?yàn)闀?huì)用其他數(shù)據(jù)源,而不是用的默認(rèn)數(shù)據(jù)源。我們先來(lái)一步一步了解一下,一起來(lái)開啟探索它默認(rèn)的數(shù)據(jù)源之旅吧。

通過三種方法來(lái)查看默認(rèn)的 DataSource 是什么

(1)日志法:在 application.properties 增加如下配置

logging.level.org.springframework=DEBUG

然后當(dāng)我們啟動(dòng)成功之后,通過開發(fā)工具 Intellij IDEA 的 Debug 的 Console 控制臺(tái),搜索“DataSource”,找到了如下日志,發(fā)現(xiàn)它默認(rèn)是 JDBC 的 Pool 的 DataSource。

spring.datasource.type=com.zaxxer.hikari.HikariDataSource,需要注意的是這是 Spring Boot 2.0 里面的新特性,代替了 1.5** 版本里面的 org.apache.tomcat.jdbc.pool.DataSource 的數(shù)據(jù)源,hikari 的口碑可以性能測(cè)試行業(yè)內(nèi)的口碑逐漸代替了 Tomcat 的 datasource。

(2)Debug 方法:在 manager 里面的如下代碼

在“userRepository.findByLastName(names);” 設(shè)置一個(gè)斷點(diǎn),然后請(qǐng)求一個(gè) URL 讓斷點(diǎn)進(jìn)來(lái),然后通過開發(fā)工具 Intellij IDEA 的 Debug 的 Memory View 視圖,里面搜索

也能發(fā)現(xiàn) DataSource,然后雙擊就能看到我們想看的內(nèi)容。

(3)最原理的方法、最常用的、原理分析方法

回到 QuickStartApplication,單擊 @SpringBootApplication 查看其源碼關(guān)鍵部分如下:

@SpringBootConfiguration@EnableAutoConfigurationpublic @interface SpringBootApplication {......}

打開 @EnableAutoConfiguration 所在 JAR 包,打開 spring-boot-autoconfigure-2.0.0.RELEASE.jar/META-INF/spring.factories 文件,發(fā)現(xiàn)如下內(nèi)容:

//# Auto Configure org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ ...... org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration打開 JpaRepositoriesAutoConfiguration 類,內(nèi)容如下: @Configuration @ConditionalOnBean(DataSource.class) @ConditionalOnClass(JpaRepository.class) @ConditionalOnMissingBean({ JpaRepositoryFactoryBean.class,JpaRepositoryConfigExtension.class }) @ConditionalOnProperty(prefix = "spring.data.jpa.repositories", name = "enabled", havingValue = "true", matchIfMissing = true) @Import(JpaRepositoriesAutoConfigureRegistrar.class) @AutoConfigureAfter(HibernateJpaAutoConfiguration.class) public class JpaRepositoriesAutoConfiguration { }

這時(shí)候可以發(fā)現(xiàn),如果使用了 Spring Boot 的注解方式和傳統(tǒng)的 XML 配置方式是有優(yōu)先級(jí)的,如果配置了 XML 中的 JpaRepositoryFactoryBean,那么就會(huì)沿用 XML 配置的一整套,而通過 @ConditionalOnMissingBean 這個(gè)注解來(lái)判斷,就不會(huì)加載 Spring Boot 的 JpaRepositoriesAutoConfiguration 此類的配置,還有就是前提條件 DataSource 和 JpaRepository 必須有相關(guān)的 Jar 存在。

打開 HibernateJpaAutoConfiguration 類:

@Configuration @ConditionalOnClass({ LocalContainerEntityManagerFactoryBean.class, EntityManager.class }) @Conditional(HibernateEntityManagerCondition.class) @AutoConfigureAfter({ DataSourceAutoConfiguration.class }) public class HibernateJpaAutoConfiguration extends JpaBaseConfiguration {......}

這個(gè)時(shí)候發(fā)現(xiàn)了 DataSourceAutoConfiguration 的配置類即 datasource 的配置內(nèi)容有哪些?

打開 DataSourceAutoConfiguration,此時(shí)發(fā)現(xiàn)了我們最關(guān)鍵的類出現(xiàn)了。

@Configuration @ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class }) @EnableConfigurationProperties(DataSourceProperties.class) @Import({ DataSourcePoolMetadataProvidersConfiguration.class,DataSourceInitializationConfiguration.class }) public class DataSourceAutoConfiguration {......}

先看 DataSourcePoolMetadataProvidersConfiguration 類吧,內(nèi)容如下:

@Configuration public class DataSourcePoolMetadataProvidersConfiguration {//tomcat.jdbc.pool.DataSource前提條件需要引入tomcat-jdbc.jar@Configuration@ConditionalOnClass(org.apache.tomcat.jdbc.pool.DataSource.class)static class TomcatDataSourcePoolMetadataProviderConfiguration {@Beanpublic DataSourcePoolMetadataProvider tomcatPoolDataSourceMetadataProvider() {return (dataSource) -> {if (dataSource instanceof org.apache.tomcat.jdbc.pool.DataSource) {return new TomcatDataSourcePoolMetadata((org.apache.tomcat.jdbc.pool.DataSource) dataSource);}return null;};}}//HikariDataSource.class前提需要引入HikariCP-2.7.8.jar@Configuration@ConditionalOnClass(HikariDataSource.class)static class HikariPoolDataSourceMetadataProviderConfiguration {@Beanpublic DataSourcePoolMetadataProvider hikariPoolDataSourceMetadataProvider() {return (dataSource) -> {if (dataSource instanceof HikariDataSource) {return new HikariDataSourcePoolMetadata((HikariDataSource) dataSource);}return null;};}}//CommonsDbcp 數(shù)據(jù)源,前提也是需要引入CommonsDbcp**.jar@Configuration@ConditionalOnClass(BasicDataSource.class)static class CommonsDbcp2PoolDataSourceMetadataProviderConfiguration {@Beanpublic DataSourcePoolMetadataProvider commonsDbcp2PoolDataSourceMetadataProvider() {return (dataSource) -> {if (dataSource instanceof BasicDataSource) {return new CommonsDbcp2DataSourcePoolMetadata((BasicDataSource) dataSource);}return null;};}} }

通過查看它的代碼可發(fā)現(xiàn),Spring Boot 為我們的 DataSource 提供了最常見的三種默認(rèn)配置:

  • HikariDataSource
  • Tomcat 的 JDBC
  • Apache 的 dbcp

而最終用哪個(gè)?就看你引用了哪個(gè) datasoure 的 jar 包了。因?yàn)殚_篇的案例用的是 Spring Boot 2.0 的默認(rèn)配置,而 2.0 放棄了默認(rèn)引用的 Tomcat 的容器,而選用了 HikariDataSource 的配置,成為了 Java 語(yǔ)言里面公認(rèn)的好的 data source,所以默認(rèn)用的是 Hikari 的 DataSource 及其 HikariDataSourcePoolMetadata 連接池。當(dāng)我們引用了 Jetty 或者 netty 等容器,連接池和 datasource 的實(shí)現(xiàn)方式也會(huì)跟著變的。

Datasource 和 JPA 都有哪些配置屬性

我們接著上面的類 DataSourceAutoConfiguration,通過 @EnableConfigurationProperties(DataSourceProperties.class) 找到了 datasource 該如何配置,打開 DataSourceProperties 源碼:

@ConfigurationProperties(prefix = "spring.datasource") public class DataSourcePropertiesimplements BeanClassLoaderAware, EnvironmentAware, InitializingBean { /*** Name of the datasource.*/ private String name = "testdb"; /*** Generate a random datasource name.*/ private boolean generateUniqueName; /*** Fully qualified name of the JDBC driver. Auto-detected based on the URL by default.*/ private String driverClassName; /*** JDBC url of the database.*/ private String url; /*** Login user of the database.*/ private String username; /*** Login password of the database.*/ private String password; /*** JNDI location of the datasource. Class, url, username & password are ignored when* set.*/ private String jndiName; ......//如果還有一些特殊的配置直接看這個(gè)類的源碼即可。 }

看到了配置數(shù)據(jù)的關(guān)鍵的幾個(gè)屬性的配置,及其一共有哪些屬性值可以去配置。@ConfigurationProperties(prefix = "spring.datasource") 這個(gè)告訴我們 application.properties 里面的 datasource 相關(guān)的配置必須有 spring.datasource 開頭,這樣當(dāng)啟動(dòng)的時(shí)候 DataSourceProperties 就會(huì)自動(dòng)加載進(jìn)來(lái) datasource 的一切配置。正如我們前面配置的一樣:

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test spring.datasource.username=jack spring.datasource.password=jack123

......這里省略了一些其他datasource的key配置。

其實(shí)到這里如果自定義配置時(shí)也可以學(xué)習(xí) Spring Data 的這種 properteis 的加載方式自定義**Properties.java,包括 DataSource 的配置方法,可以借鑒當(dāng)時(shí)寫的framework.jar。

JpaBaseConfiguration

我們回過頭來(lái)再來(lái)看 HibernateJpaAutoConfiguration 的父類 JpaBaseConfiguration 打開關(guān)鍵內(nèi)容如下:

@EnableConfigurationProperties(JpaProperties.class) @Import(DataSourceInitializedPublisher.Registrar.class) public abstract class JpaBaseConfiguration implements BeanFactoryAware {private final DataSource dataSource;private final JpaProperties properties; ......}

這個(gè)時(shí)候發(fā)現(xiàn)了 JpaProperties 類:

@ConfigurationProperties(prefix = "spring.jpa") public class JpaProperties {//jpa原生的一些特殊屬性private Map<String, String> properties = new HashMap<String, String>();//databasePlatform名字,默認(rèn)和Database一樣。private String databasePlatform;//數(shù)據(jù)庫(kù)平臺(tái)MYSQL、DB2、H2......private Database database;//是否根據(jù)實(shí)體創(chuàng)建Ddlprivate boolean generateDdl = false;//是否顯示sql,默認(rèn)不顯示private boolean showSql = false;private Hibernate hibernate = new Hibernate(); ...... }

此時(shí)再打開 Hibernate 類:

public static class Hibernate { private String ddlAuto; /*** Use Hibernate's newer IdentifierGenerator for AUTO, TABLE and SEQUENCE. This is* actually a shortcut for the "hibernate.id.new_generator_mappings" property.* When not specified will default to "false" with Hibernate 5 for back* compatibility.*/ private Boolean useNewIdGeneratorMappings; @NestedConfigurationProperty private final Naming naming = new Naming(); ......//我們看到Hibernate類就這三個(gè)屬性。 }

再打開 Naming 源碼看一下命名規(guī)范:

public static class Naming {private static final String DEFAULT_HIBERNATE4_STRATEGY = "org.springframework.boot.orm.jpa.hibernate.SpringNamingStrategy";private static final String DEFAULT_PHYSICAL_STRATEGY = "org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy";private static final String DEFAULT_IMPLICIT_STRATEGY = "org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy";/*** Hibernate 5 implicit naming strategy fully qualified name.*/private String implicitStrategy;/*** Hibernate 5 physical naming strategy fully qualified name.*/private String physicalStrategy;/*** Hibernate 4 naming strategy fully qualified name. Not supported with Hibernate* 5.*/private String strategy; ......}

看到這里面 Naming 命名策略,兼容了 Hibernate4 和 Hibernate5 并且給出了默認(rèn)的策略,后面章節(jié)我們做詳細(xì)解釋。

所以配置文件中關(guān)于 JPA 的配置基本上就這些配置項(xiàng)。

spring.jpa.database-platform=mysql spring.jpa.generate-ddl=false spring.jpa.hibernate.ddl-auto=none spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true spring.jpa.properties.hibernate.type=trace spring.jpa.properties.hibernate.use_sql_comments=true spring.jpa.properties.hibernate.jdbc.batch_size=50

Configuration 思路,實(shí)戰(zhàn)學(xué)習(xí)方法

其實(shí)在實(shí)際工作中,若遇到問題,經(jīng)常看到開發(fā)人員去百度進(jìn)行狂搜,看看怎么配置的,然后試了了半天發(fā)現(xiàn)怎么配置都沒效果。其實(shí)這里給大家提供了一個(gè)思路,我們?cè)谡遗渲庙?xiàng)的時(shí)候,看看源碼都支持哪些 key,而這些 key 分別代表什么意思然后再到百度搜索,這樣我們能對(duì)癥下藥,正確完美的完成我們的配置文件的配置。

總結(jié)

以上是生活随笔為你收集整理的Spring Data JPA 从入门到精通~默认数据源的讲解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。