欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot項目為何引入大量的starter?如何自定義starter?

 更新時間:2022年04月28日 16:43:22   作者:??CoderJie????  
這篇文章主要介紹了SpringBoot項目為何引入大量的starter?如何自定義starter?文章基于這兩個問題展開全文,需要的小伙伴可以參考一下

1 前言

為什么我們在使用SpringBoot框架開發(fā)Java Web應用需要引入大量的starter?例如,我們引入Redis就在Maven中導入spring-boot-starter-data-redis。大家都知道SpringBoot的核心功能是自動裝配,簡化配置,我們通過starter實現SpringBoot自動裝配的功能。那么我們如何去構建自己的starter呢?

SpringBoot現在幾乎占據的Java的大半壁江山,它的優(yōu)勢顯而易見,它通過自動裝配功能為我們簡化了Spring繁雜的配置,并且內嵌Tomcat讓我們啟動Web項目不需要去自己配置Tomcat,這些都能大大提高我們的開發(fā)效率和代碼質量。至于我們?yōu)槭裁丛谑褂肧pringBoot框架構建項目時,導入其它依賴都是什么什么starter?其實,這些starte就為我們實現了SpringBoot自動裝配的功能,下面我們將一起將一下自動裝配功能如何實現,自己怎樣去構建一個SpringBoot的starter應用。

2 @EnableConfigurationProperties實現自動裝配

2.1 創(chuàng)建一個starter項目

通過Maven創(chuàng)建一個項目

在pom文件中添加對應的依賴:

<dependencies>
 ? ? ?  <dependency>
 ? ? ? ? ?  <groupId>org.projectlombok</groupId>
 ? ? ? ? ?  <artifactId>lombok</artifactId>
 ? ? ? ? ?  <version>1.18.22</version>
 ? ? ?  </dependency>
 ? ? ?  <dependency>
 ? ? ? ? ?  <groupId>org.springframework.boot</groupId>
 ? ? ? ? ?  <artifactId>spring-boot-starter-web</artifactId>
 ? ? ? ? ?  <version>2.5.6</version>
 ? ? ?  </dependency>
 ?  </dependencies>

2.2 創(chuàng)建一個需要自動裝配的Bean

使用@EnableConfigurationProperties注解

創(chuàng)建一個類這個類最后是可以通過配置文件自動裝配的,添加注解@EnableConfigurationProperties時會報錯,因為這個是需要將當前對象定義為Spring的一個組件,但是我們不是通過@Component注解注冊成為Spring組件的。

@Data
@ConfigurationProperties(prefix = "com.zhj.vo.student")
public class Student {
?
 ? ?private Long id;
?
 ? ?private String name;
?
 ? ?private Integer age;
}

2.3 自動裝配類實現

@Configuration是需要進行Bean注冊的類

@EnableConfigurationProperties({Student.class}) 將該Bean注冊進去

/**
 * 自動裝配類
 */
@Configuration // 需要進行Bean注冊的
@EnableConfigurationProperties({Student.class}) //Bean注冊
public class AutoConfiguration {
}

2.4 編寫測試項目

pom文件導入測試需要的依賴

<dependency>
 ?  <groupId>junit</groupId>
 ?  <artifactId>junit</artifactId>
 ?  <version>4.12</version>
 ?  <scope>test</scope>
</dependency>
<dependency>
 ?  <groupId>org.springframework.boot</groupId>
 ?  <artifactId>spring-boot-starter-test</artifactId>
 ?  <version>2.5.6</version>
</dependency>

編寫配置文件:

com:
  zhj:
    vo:
      student:
        id: 1
        name: '小明'
        age: 12

編寫測試類:

/**
 * 自動注入測試類
 */
@RunWith(SpringRunner.class) // junit4 測試環(huán)境
@WebAppConfiguration // 啟動web運行環(huán)境
@SpringBootTest(classes = AutoConfigApplication.class) // 指定啟動類
public class AutoConfigTest {
?
 ? ?@Autowired
 ? ?@Qualifier("com.zhj.vo.student-com.zhj.vo.Student") // 前綴-類名 注入
 ? ?private Student student;
?
 ? ?@Test
 ? ?public void test01() {
 ? ? ? ?System.out.println(student);
 ?  }
}

可以看到Bean通過配置文件成功注入Spring容器中,可以獲取到Student對象

Student(id=1, name=小明, age=12)

3 @import 實現自動注入

@import注解的主要作用就是將Bean注入Spring容器

3.1 方式一 直接制定Bean的導入

1 修改需要自動裝配類

/**
 * 自動裝配類
 */
@Configuration // 需要進行Bean注冊的
@Import({Student.class}) //Bean注冊
public class AutoConfiguration {
}

2 修改測試類

/**
 * 自動注入測試類
 */
@RunWith(SpringRunner.class) // junit4 測試環(huán)境
@WebAppConfiguration // 啟動web運行環(huán)境
@SpringBootTest(classes = AutoConfigApplication.class) // 指定啟動類
public class AutoConfigTest {
?
 ? ?@Autowired
 ? ?private Student student;
?
 ? ?@Test
 ? ?public void test01() {
 ? ? ? ?System.out.println(student);
 ?  }
}

發(fā)現這樣也是可以通過配置文件將Bean注入Spring容器中

3.2 方式二 使用ImportSelector注入Bean

如果需要注冊的類很多,第一種方式就得將所有需要注入的Bean一一列出來

1 創(chuàng)建DefaultImportSelector實現ImportSelector接口

public class DefaultImportSelector implements ImportSelector {
 ? ?@Override
 ? ?public String[] selectImports(AnnotationMetadata importingClassMetadata) {
 ? ? ? ?return new String[] {"com.zhj.vo.Student"};
 ?  }
}

2 修改需要自動裝配類

/**
 * 自動裝配類
 */
@Configuration // 需要進行Bean注冊的
@Import({DefaultImportSelector.class})
public class AutoConfiguration {
}

3.3 方式三 使用ImportBeanDefinitionRegistrar注入Bean

以上方式都是Spring容器負責了Bean的注冊,我們可以通過ImportBeanDefinitionRegistrar自己去向Spring容器注入Bean

1 創(chuàng)建DefaultImportBeanDefinitionRegister 實現ImportBeanDefinitionRegistrar接口

public class DefaultImportBeanDefinitionRegister implements ImportBeanDefinitionRegistrar {
?
 ? ?@Override
 ? ?public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
 ? ? ? ?RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Student.class); // 配置bean
 ? ? ? ?registry.registerBeanDefinition("studentInstance", rootBeanDefinition); // Bean 注冊
 ?  }
}

2 修改需要自動裝配類

/**
 * 自動裝配類
 */
@Configuration // 需要進行Bean注冊的
@Import({DefaultImportBeanDefinitionRegister.class})
public class AutoConfiguration {
}

4 實現跨項目自動配置

上述自動裝配的實現都是通過starter項目的配置文件,將bean注入,并在starter項目中進行測試。那么我們如何

4.1 添加依賴

<dependency>
 ?  <groupId>org.springframework.boot</groupId>
 ?  <artifactId>spring-boot-configuration-processor</artifactId>
 ?  <version>2.5.6</version>
</dependency>

4.2 編譯項目

使用Maven編譯項目會產生spring-configuration-metadata.json這個文件

{
 ?"groups": [
 ?  {
 ? ? ?"name": "com.zhj.vo.student",
 ? ? ?"type": "com.zhj.vo.Student",
 ? ? ?"sourceType": "com.zhj.vo.Student"
 ?  }
  ],
 ?"properties": [
 ?  {
 ? ? ?"name": "com.zhj.vo.student.age",
 ? ? ?"type": "java.lang.Integer",
 ? ? ?"sourceType": "com.zhj.vo.Student"
 ?  },
 ?  {
 ? ? ?"name": "com.zhj.vo.student.id",
 ? ? ?"type": "java.lang.Long",
 ? ? ?"sourceType": "com.zhj.vo.Student"
 ?  },
 ?  {
 ? ? ?"name": "com.zhj.vo.student.name",
 ? ? ?"type": "java.lang.String",
 ? ? ?"sourceType": "com.zhj.vo.Student"
 ?  }
  ],
 ?"hints": []
}

4.3 修改自動裝配類修改

使自動裝配類可以自動注入Bean

/**
 * 自動裝配類
 */
@Configuration // 需要進行Bean注冊的
@Import({DefaultImportBeanDefinitionRegister.class})
public class AutoConfiguration {
?
 ? ?// 自動注冊Bean
 ? ?@Bean(name = "Students")
 ? ?public List<String> getNameList() {
 ? ? ? ?List list = new ArrayList();
 ? ? ? ?list.add("小明");
 ? ? ? ?list.add("小紅");
 ? ? ? ?list.add("小李");
 ? ? ? ?return list;
 ?  }
}

4.4 spring.factories 文件

固定存放位置src/main/resources/META-INF/spring.factories

這個文件就是支持不同文件自動裝配的核心文件

添加內容,指定自動裝配的類

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.zhj.config.AutoConfiguration

4.5 其它Web項目引入spring-boot-auto-config-starter

<dependencies>
 ?  <dependency>
 ? ? ?  <groupId>com.zhj</groupId>
 ? ? ?  <artifactId>spring-boot-auto-config-starter</artifactId>
 ? ? ?  <version>1.0-SNAPSHOT</version>
 ?  </dependency>
</dependencies>

4.6 測試

將vo也就是Student寫入web項目:

@Data
@ConfigurationProperties(prefix = "com.zhj.vo.student")
public class Student {
?
 ? ?private Long id;
?
 ? ?private String name;
?
 ? ?private Integer age;
}

將配置寫入web項目:

com:
  zhj:
 ?  vo:
 ? ?  student:
 ? ? ?  id: 1
 ? ? ?  name: '小明'
 ? ? ?  age: 12

構建測試接口:

@RestController
public class HelloController {
?
 ? ?@Autowired
 ? ?private Student student;
?
 ? ?@GetMapping("/hello")
 ? ?public String hello() {
 ? ? ? ?return "hello "+ student;
 ?  }
}

結果:

5 總結

本文就通過自己構建一個SpringBoot的簡單的starter項目,讓我們去理解SpringBoot的自動裝配。SpringBoot為開發(fā)者提供了多種Bean裝配的方式,我們需要做的就是理解這些自動裝配機制,并且能夠靈活應用在企業(yè)的開發(fā)中,可以開發(fā)自己開發(fā)starter,充分利用SpringBoot的優(yōu)勢,讓我們的項目也可以通過簡單的配置,就將Bean注入Spring容器中,供我們靈活應用這些Bean。spring.factories這個文件也是重中之重,讓我們可以輕松的跨項目向Spring容器注入Bean。

到此這篇關于SpringBoot項目為何引入大量的starter?如何自定義starter?的文章就介紹到這了,更多相關SpringBoot自定義starter內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 詳談Java中的事件監(jiān)聽機制

    詳談Java中的事件監(jiān)聽機制

    下面小編就為大家?guī)硪黄斦凧ava中的事件監(jiān)聽機制。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • Java中replace、replaceAll和replaceFirst函數的用法小結

    Java中replace、replaceAll和replaceFirst函數的用法小結

    相信會java的同學估計都用過replace、replaceAll、replaceFirst這三個函數,可是,我們真的懂他們嗎?下面通過這篇文章大家再來好好學習學習下這幾個函數。
    2016-09-09
  • 手寫java性能測試框架第二版

    手寫java性能測試框架第二版

    這篇文章主要為大家介紹了手寫java性能測試框架第二版實現示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • socket編程時的發(fā)送與接收數據時的問題解析

    socket編程時的發(fā)送與接收數據時的問題解析

    這篇文章主要為大家介紹了socket編程時的發(fā)送與接收數據時的問題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • Java中類的初始化和實例化區(qū)別詳解

    Java中類的初始化和實例化區(qū)別詳解

    這篇文章主要介紹了Java中類的初始化和實例化區(qū)別詳解,類的初始化<BR>是完成程序執(zhí)行前的準備工作,類的實例化(實例化對象)是指創(chuàng)建一個對象的過程,需要的朋友可以參考下
    2023-08-08
  • java Timer測試定時調用及固定時間執(zhí)行代碼示例

    java Timer測試定時調用及固定時間執(zhí)行代碼示例

    這篇文章主要介紹了java Timer測試定時調用及固定時間執(zhí)行代碼示例,分享了相關代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • java并發(fā)編程Lock鎖可重入性與公平性分析

    java并發(fā)編程Lock鎖可重入性與公平性分析

    這篇文章主要為大家介紹了java并發(fā)編程Lock鎖可重入性與公平性分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • Springboot跨域處理的多種方式小結

    Springboot跨域處理的多種方式小結

    當一臺服務器資源從另一臺服務器(不同 的域名或者端口)請求一個資源或者接口,就會發(fā)起一個跨域 HTTP 請求,這篇文章主要介紹了Springboot跨域處理的多種方式小結,需要的朋友可以參考下
    2023-11-11
  • java簡單選擇排序實例

    java簡單選擇排序實例

    這篇文章主要為大家詳細介紹了java簡單選擇排序實例,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • java對象序列化與反序列化原理解析

    java對象序列化與反序列化原理解析

    這篇文章主要介紹了java對象序列化與反序列化原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02

最新評論