最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot使用編程方式配置DataSource的方法

 更新時(shí)間:2019年01月28日 17:16:43   作者:qianmoQ  
這篇文章主要介紹了SpringBoot使用編程方式配置DataSource的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

Spring Boot使用固定算法來掃描和配置DataSource。這使我們可以在默認(rèn)情況下輕松獲得完全配置的DataSource實(shí)現(xiàn)。

Spring Boot還會(huì)按順序快速的自動(dòng)配置連接池(HikariCP, Apache Tomcat或Commons DBCP),具體取決于路徑中的哪些類。

雖然Spring Boot的DataSource自動(dòng)配置在大多數(shù)情況下運(yùn)行良好,但有時(shí)我們需要更高級(jí)別的控制,因此我們必須設(shè)置自己的DataSource實(shí)現(xiàn),因此忽略自動(dòng)配置過程。

Maven依賴

總體而言,以編程方式創(chuàng)建DataSource實(shí)現(xiàn)非常簡(jiǎn)單。

為了學(xué)習(xí)如何實(shí)現(xiàn)這一目標(biāo),我們將實(shí)現(xiàn)一個(gè)簡(jiǎn)單的存儲(chǔ)庫層,它將對(duì)某些JPA實(shí)體執(zhí)行CRUD操作。

我們來看看我們的演示項(xiàng)目的依賴項(xiàng):

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
  <groupId>com.h2database</groupId>
  <artifactId>h2</artifactId>
  <version>2.4.1</version> 
  <scope>runtime</scope> 
</dependency>

我們將使用內(nèi)存中的H2數(shù)據(jù)庫實(shí)例來運(yùn)行存儲(chǔ)庫層。通過這樣做,我們將能夠測(cè)試以編程方式配置的DataSource,而無需執(zhí)行昂貴的數(shù)據(jù)庫操作。

讓我們確保在Maven Central上查看最新版本的spring-boot-starter-data-jpa。

配置DataSource

如果我們堅(jiān)持使用Spring Boot的DataSource自動(dòng)配置并以當(dāng)前狀態(tài)運(yùn)行我們的項(xiàng)目,程序?qū)搭A(yù)期工作。

Spring Boot將為我們完成所有重型基礎(chǔ)設(shè)施管道。這包括創(chuàng)建H2 DataSource實(shí)現(xiàn),該實(shí)現(xiàn)將由HikariCP,Apache Tomcat或Commons DBCP自動(dòng)處理,并設(shè)置內(nèi)存數(shù)據(jù)庫實(shí)例。

此外,我們甚至不需要?jiǎng)?chuàng)建application.properties文件,因?yàn)镾pring Boot也會(huì)提供一些默認(rèn)的數(shù)據(jù)庫設(shè)置。

正如我們之前提到的,有時(shí)我們需要更高級(jí)別的自定義,因此我們必須以編程方式配置我們自己的DataSource實(shí)現(xiàn)。

實(shí)現(xiàn)此目的的最簡(jiǎn)單方法是定義DataSource工廠方法,并將其放在使用@Configuration注解的類中:

@Configuration
public class DataSourceConfig {
   
  @Bean
  public DataSource getDataSource() {
    DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
    dataSourceBuilder.driverClassName("org.h2.Driver");
    dataSourceBuilder.url("jdbc:h2:mem:test");
    dataSourceBuilder.username("SA");
    dataSourceBuilder.password("");
    return dataSourceBuilder.build();
  }
}

在這種情況下,我們使用方便的DataSourceBuilder類 - 一個(gè)簡(jiǎn)潔的Joshua Bloch構(gòu)建器模式 - 以編程方式創(chuàng)建我們的自定義DataSource對(duì)象。

這種方法非常好,因?yàn)闃?gòu)建器可以使用一些常用屬性輕松配置DataSource。此外,它還可以使用底層連接池。

使用application.properties文件外部化DataSource配置

當(dāng)然,也可以部分外部化我們的DataSource配置。例如,我們可以在工廠方法中定義一些基本的DataSource屬性:

@Bean
public DataSource getDataSource() { 
  DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create(); 
  dataSourceBuilder.username("SA"); 
  dataSourceBuilder.password(""); 
  return dataSourceBuilder.build(); 
}

并在application.properties文件中指定一些額外的配置:

spring.datasource.url=jdbc:h2:mem:test
spring.datasource.driver-class-name=org.h2.Driver

在外部源中定義的屬性(例如上面的application.properties文件或通過使用@ConfigurationProperties注解的類)將覆蓋Java API中定義的屬性。

很明顯,通過這種方法,我們不再將DataSource配置設(shè)置保存在一個(gè)地方。

另一方面,它允許我們保持編譯時(shí)和運(yùn)行時(shí)配置彼此并很好地分離。

這非常好,因?yàn)樗试S我們輕松設(shè)置綁定點(diǎn)。這樣我們可以從其他來源包含不同的DataSource,而無需重構(gòu)我們的bean工廠方法。

測(cè)試DataSource配置
測(cè)試我們的自定義DataSource配置非常簡(jiǎn)單。整個(gè)過程歸結(jié)為創(chuàng)建JPA實(shí)體,定義基本存儲(chǔ)庫接口以及測(cè)試存儲(chǔ)庫層。

  • 創(chuàng)建JPA實(shí)體

讓我們開始定義我們的示例JPA實(shí)體類,它將為用戶建模:

@Entity
@Table(name = "users")
public class User {
   
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private long id;
  private String name;
  private String email;
 
  // standard constructors / setters / getters / toString
   
}
  • 存儲(chǔ)庫層

我們需要實(shí)現(xiàn)一個(gè)基本的存儲(chǔ)庫層,它允許我們對(duì)上面定義的User實(shí)體類的實(shí)例執(zhí)行CRUD操作。

由于我們使用的是Spring Data JPA,因此我們不必從頭開始創(chuàng)建自己的DAO實(shí)現(xiàn)。我們只需要擴(kuò)展CrudRepository接口獲得一個(gè)工作的存儲(chǔ)庫實(shí)現(xiàn):

@Repository
public interface UserRepository extends CrudRepository<User, Long> {}
  • 測(cè)試存儲(chǔ)庫層

最后,我們需要檢查我們的編程配置的DataSource是否實(shí)際工作。我們可以通過集成測(cè)試輕松完成此任務(wù):

@RunWith(SpringRunner.class)
@DataJpaTest
public class UserRepositoryIntegrationTest {
   
  @Autowired
  private UserRepository userRepository;
  
  @Test
  public void whenCalledSave_thenCorrectNumberOfUsers() {
    userRepository.save(new User("Bob", "bob@domain.com"));
    List<User> users = (List<User>) userRepository.findAll();
     
    assertThat(users.size()).isEqualTo(1);
  }  
}

UserRepositoryIntegrationTest類是測(cè)試用例。它只是運(yùn)行兩個(gè)存儲(chǔ)庫接口的CRUD方法來持久化并查找實(shí)體。

請(qǐng)注意,無論我們是否決定以編程方式配置DataSource實(shí)現(xiàn),或?qū)⑵洳鸱譃镴ava配置方法和application.properties文件,我們都應(yīng)該始終獲得有效的數(shù)據(jù)庫連接。

  • 運(yùn)行示例應(yīng)用程序

最后,我們可以使用標(biāo)準(zhǔn)的main()方法運(yùn)行我們的演示應(yīng)用程序:

@SpringBootApplication
public class Application {
 
  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }
 
  @Bean
  public CommandLineRunner run(UserRepository userRepository) throws Exception {
    return (String[] args) -> {
      User user1 = new User("John", "john@domain.com");
      User user2 = new User("Julie", "julie@domain.com");
      userRepository.save(user1);
      userRepository.save(user2);
      userRepository.findAll().forEach(user -> System.out.println(user);
    };
  }
}

我們已經(jīng)測(cè)試了存儲(chǔ)庫層,因此我們確信我們的DataSource已經(jīng)成功配置。因此,如果我們運(yùn)行示例應(yīng)用程序,我們應(yīng)該在控制臺(tái)輸出中看到存儲(chǔ)在數(shù)據(jù)庫中的User實(shí)體列表。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java解析使用JSON的多種方法

    Java解析使用JSON的多種方法

    使用JSON作為數(shù)據(jù)傳輸,在瀏覽器端非常方便。JSON去除了所有JavaScript執(zhí)行代碼,只保留對(duì)象格式,而且JSON天生適合JavaScript處理,所以,絕大多數(shù)REST?API都選擇JSON作為數(shù)據(jù)傳輸格式。現(xiàn)在問題來了:使用Java如何對(duì)JSON進(jìn)行讀寫?
    2022-12-12
  • java配置dbcp連接池(數(shù)據(jù)庫連接池)示例分享

    java配置dbcp連接池(數(shù)據(jù)庫連接池)示例分享

    java配置dbcp連接池示例分享,大家參考使用吧
    2013-12-12
  • 深入理解SpringBoot事務(wù)傳播機(jī)制

    深入理解SpringBoot事務(wù)傳播機(jī)制

    本文介紹了SpringBoot中事務(wù)傳播機(jī)制的原理及其常用配置,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12
  • Springboot中登錄后關(guān)于cookie和session攔截問題的案例分析

    Springboot中登錄后關(guān)于cookie和session攔截問題的案例分析

    這篇文章主要介紹了Springboot中登錄后關(guān)于cookie和session攔截案例,本文通過實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • java8?stream排序以及自定義比較器方式

    java8?stream排序以及自定義比較器方式

    這篇文章主要介紹了java8?stream排序以及自定義比較器方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Maven優(yōu)雅的添加第三方Jar包的方法

    Maven優(yōu)雅的添加第三方Jar包的方法

    下面小編就為大家?guī)硪黄狹aven優(yōu)雅的添加第三方Jar包的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-09-09
  • 從一道面試題看你對(duì)java的理解程度

    從一道面試題看你對(duì)java的理解程度

    這篇文章主要給大家介紹了關(guān)于如何從一道面試題看你對(duì)java的理解程度的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起看看吧
    2018-09-09
  • JAVA通過HttpURLConnection 上傳和下載文件的方法

    JAVA通過HttpURLConnection 上傳和下載文件的方法

    這篇文章主要介紹了JAVA通過HttpURLConnection 上傳和下載文件的方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-09-09
  • 詳解Java中的泛型

    詳解Java中的泛型

    這篇文章主要介紹了Java中的泛型,當(dāng)我們不確定數(shù)據(jù)類型時(shí),我們可以暫時(shí)使用一個(gè)字母 T代替數(shù)據(jù)類型,例如寫一個(gè)方法,但是我們不知道它是傳遞的是什么數(shù)據(jù)類型,我們就可以使用泛型,到時(shí)候只要指明T是什么數(shù)據(jù)類型,就可以使用了,需要的朋友可以參考下
    2023-05-05
  • 如何在Spring Boot啟動(dòng)時(shí)運(yùn)行定制的代碼

    如何在Spring Boot啟動(dòng)時(shí)運(yùn)行定制的代碼

    在本文中您將學(xué)習(xí)如何掛鉤應(yīng)用程序引導(dǎo)程序生命周期并在Spring Boot啟動(dòng)時(shí)執(zhí)行代碼。文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12

最新評(píng)論

靖远县| 黄冈市| 城口县| 顺义区| 长乐市| 普安县| 英德市| 柳河县| 故城县| 南开区| 新邵县| 高尔夫| 广河县| 云林县| 卢氏县| 伊吾县| 凤凰县| 秀山| 兴义市| 穆棱市| 清苑县| 信丰县| 图木舒克市| 临高县| 女性| 奉化市| 章丘市| 田东县| 泾川县| 读书| 道孚县| 玛纳斯县| 张北县| 马龙县| 湘潭县| 贵德县| 烟台市| 广宗县| 赣州市| 疏勒县| 集贤县|