14個SpringBoot優(yōu)化小妙招,寫代碼像寫詩
今天我們來分享一下平時用SpringBoot開發(fā)時候的一些優(yōu)化小妙招,用好這些優(yōu)化小妙招讓我們開發(fā)的系統(tǒng)架構(gòu)、系統(tǒng)代碼、開發(fā)流程、測試流程、運(yùn)維監(jiān)控看起來就跟寫詩一樣優(yōu)雅,讓我們每個人手頭負(fù)責(zé)的代碼和工程都要很漂亮~~~
這里的優(yōu)化小妙招很多不是說直接對springboot來優(yōu)化,有些是對springboot自己的優(yōu)雅特性做一些總結(jié),幫助大家更加系統(tǒng)全面的了解springboot開發(fā)的時候,如何做可以讓我們的代碼和系統(tǒng)更加的優(yōu)雅。
當(dāng)然,因?yàn)橐窒淼膬?yōu)化小妙招很多,我們更多的是給大家展示一下優(yōu)化的一些點(diǎn)和思路,具體的使用大家如果要落地,還得自己查閱官網(wǎng)資料!
1. 使用@SpringBootApplication注解簡化配置
SpringBoot提倡“約定大于配置”,而@SpringBootApplication注解正是這一理念的體現(xiàn)。它集成了@Configuration、@EnableAutoConfiguration、@ComponentScan三個注解,讓你的主類配置瞬間簡潔明了。
說實(shí)話,一般來說我們都是用springboot來開發(fā)系統(tǒng)的時候,都是默認(rèn)都加@SpringBootApplication注解的,這個倒不能說是優(yōu)化小妙招,更多的是給大家引入一下這個注解,我們可以學(xué)習(xí)一下springboot框架這種優(yōu)雅的設(shè)計理念。
也就是說,SpringBoot為了盡最大可能去簡化一個web系統(tǒng)的啟動,設(shè)計了SpringApplication啟動類一鍵啟動一個web系統(tǒng),所有的web server、spring容器、bean管理、三方組件管理、擴(kuò)展組件管理,其實(shí)都是默認(rèn)行為去管控的,最大簡化我們的系統(tǒng)開發(fā),搭配上一些注解的使用,就從頭開始就讓我們的系統(tǒng)非常優(yōu)雅!
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
2. 利用配置文件簡化代碼
SpringBoot支持多種格式的配置文件,如application.properties和application.yml。你可以將一些配置信息放在這里,減少硬編碼,讓代碼更加靈活。
這個說實(shí)話一般人用springboot開發(fā)系統(tǒng)也都是加配置文件的,畢竟配置信息不要寫死在代碼里,把配置信息放外部配置文件,這樣才能優(yōu)雅,而且一般還可以搭配springboot的profile功能把不同環(huán)境的配置文件區(qū)分開來,部署的時候指定一個環(huán)境就可以了。
# application.yml
server:
port: 8080
my:
greeting: Hello, World!
@Value("${my.greeting}")
private String greeting;
3. 使用Actuator監(jiān)控應(yīng)用
SpringBoot Actuator提供了很多內(nèi)置的端點(diǎn),讓你能夠監(jiān)控和管理應(yīng)用。比如/health端點(diǎn)可以告訴你應(yīng)用的健康狀態(tài),/metrics端點(diǎn)則提供了各種度量信息。
這個其實(shí)就是系統(tǒng)上線以后我們是需要對系統(tǒng)進(jìn)行監(jiān)控的,那一般小公司沒有大公司完善的基礎(chǔ)設(shè)施,如果我們要快速開發(fā)和部署一個系統(tǒng)上線,其實(shí)可以直接用springboot自帶的監(jiān)控功能來對線上系統(tǒng)進(jìn)行基礎(chǔ)的監(jiān)控。
<!-- 在pom.xml中添加Actuator依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
4. 異步處理提升性能
SpringBoot支持異步處理,你可以使用@Async注解來異步執(zhí)行方法,提升應(yīng)用的性能和響應(yīng)速度,這個是一個好功能,如果執(zhí)行異步功能,一般我們都要自己開線程去執(zhí)行異步任務(wù),但是用異步注解可以由框架啟動一個內(nèi)嵌的異步任務(wù)執(zhí)行我們的代碼邏輯,這個相當(dāng)優(yōu)雅,有沒有?代碼是不是很漂亮!
@Service
public class AsyncService {
@Async
public void executeAsyncTask() {
// 執(zhí)行異步任務(wù)
}
}
5. 利用緩存減少數(shù)據(jù)庫訪問
SpringBoot支持多種緩存抽象,如ConcurrentMap、EhCache、Redis等。使用緩存可以減少對數(shù)據(jù)庫的訪問,提高應(yīng)用的性能。以前咱們用緩存的時候,那肯定是要自己封裝緩存組件的,完了在封裝好的緩存組件里基于開源的緩存系統(tǒng)的客戶端來實(shí)現(xiàn)各類功能,對吧,然后再代碼里是不是我們還得自己動手編寫緩存讀寫的代碼邏輯?
好,那現(xiàn)在我們可以用@CacheConfig、@Cacheable等注解直接讓框架去托管緩存的讀寫,自動把數(shù)據(jù)庫查詢結(jié)果進(jìn)行緩存,以及下次查找的時候自動讀取緩存,是不是感覺很方便?就省去了自己寫緩存讀寫代碼的過程了,又變得優(yōu)雅了有沒有~~~
@Service
@CacheConfig(cacheNames = "books")
public class BookService {
@Cacheable
public Book findBook(ISBN isbn) {
// 模擬耗時操作
return findBookFromDatabase(isbn);
}
}
6. 使用JPA簡化數(shù)據(jù)庫操作
SpringBoot與Spring Data JPA結(jié)合,可以讓你用非常簡潔的代碼完成復(fù)雜的數(shù)據(jù)庫操作。咱們平時要是封裝數(shù)據(jù)庫操作,是不是得自己動手搞?那現(xiàn)在直接用Spring Data JPA來做數(shù)據(jù)庫操作的ORM,是不是感覺方便了很多?
以前我們得自己寫sql語句,自己做數(shù)據(jù)的增刪改查,現(xiàn)在都是面向?qū)ο缶帉憯?shù)據(jù)庫操作邏輯,框架底層自動托管生成sql語句去做數(shù)據(jù)庫的增刪改查,是不是很優(yōu)雅很方便?
public interface BookRepository extends JpaRepository<Book, Long> {
List<Book> findByAuthor(String author);
}
7. 優(yōu)化RESTful API設(shè)計
RESTful API的設(shè)計應(yīng)該簡潔、直觀。使用SpringBoot,你可以很容易地創(chuàng)建RESTful API,并使用Swagger等工具進(jìn)行文檔生成和測試。這個功能實(shí)在是太常用了,沒用springboot的時候,其實(shí)咱們還得自己整合ssm框架,完了去用springmvc開發(fā)web接口,現(xiàn)在用了springboot以后,內(nèi)嵌就幫我們搞定了spring和springmvc的框架整合這些事情,直接上手編寫web接口,一鍵啟動啟動就可以對外提供http接口了,很方便有沒有~~~
@RestController
@RequestMapping("/books")
public class BookController {
@GetMapping("/{id}")
public ResponseEntity<Book> getBook(@PathVariable Long id) {
// 獲取書籍并返回
}
}
8. 使用Spring Security保護(hù)應(yīng)用
SpringBoot與Spring Security的結(jié)合,可以讓你輕松地保護(hù)你的應(yīng)用。你可以配置用戶、角色、權(quán)限等,還可以使用OAuth2、JWT等高級特性。所謂的安全性保護(hù),說白了就是我們寫好的系統(tǒng)發(fā)布上線了,不能隨便誰都可以來調(diào)用接口吧?不能隨便誰來提交數(shù)據(jù)我們都允許修改系統(tǒng)數(shù)據(jù)庫里的數(shù)據(jù)吧?不能隨便誰來查詢數(shù)據(jù)我們都開放給他查詢吧?
那是不是得有一套安全防護(hù)機(jī)制?比如說限制一下哪些http接口路徑要進(jìn)行防護(hù),我們防護(hù)的時候是怎么防護(hù),是不是說要求請求方必須攜帶用戶token信息,然后是不是要對請求里帶的token信息進(jìn)行有效校驗(yàn)、權(quán)限校驗(yàn)?必須是我們允許的用戶攜帶了有效的校驗(yàn)信息,我們才可以允許他來請求系統(tǒng),是不是?
那所以這塊是不是可以跟spring security框架整合,直接把防護(hù)性功能給做了?
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/home").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.and()
.logout();
}
}
9. 利用Lombok簡化模型類
Lombok是一個Java庫,它可以自動插入編輯器并構(gòu)建工具,簡化Java模型類的編寫。使用Lombok,你可以省去getter、setter、構(gòu)造器等方法的編寫。這個lombok框架還是很方便的,因?yàn)槲覀冇辛怂筒挥脛邮謱懸淮蠖训娜哂喾椒?,讓我們的代碼更加簡潔明了,domain領(lǐng)域?qū)ο罂梢詫W⒆约旱膶傩跃涂梢粤恕?/p>
@Data
public class Book {
private Long id;
private String title;
private String author;
}
10. 使用MapStruct處理對象映射
MapStruct是一個代碼生成器,它基于約定優(yōu)于配置的原則,可以在Java bean類型之間自動實(shí)現(xiàn)映射。使用MapStruct,你可以避免手動編寫繁瑣的映射代碼。這個框架也是相當(dāng)?shù)挠杏?,我們?nèi)绻窃谝恍¬O、DO、DTO等對象之間進(jìn)行對象轉(zhuǎn)換,不用自己動手封裝轉(zhuǎn)換邏輯了,直接用這個框架就可以實(shí)現(xiàn)對象轉(zhuǎn)換了,很優(yōu)雅有么有~~~
@Mapper
public interface BookMapper {
BookMapper INSTANCE = Mappers.getMapper(BookMapper.class);
BookDto toDto(Book entity);
Book toEntity(BookDto dto);
}
11. 使用Spring Boot Admin監(jiān)控多個應(yīng)用
Spring Boot Admin是一個開源社區(qū)項(xiàng)目,用于管理和監(jiān)控基于Spring Boot的應(yīng)用。它可以顯示應(yīng)用的健康狀態(tài)、度量信息、環(huán)境屬性等。這個就跟我們上面說的一樣,springboot快速開發(fā)一個系統(tǒng)然后發(fā)布上線,咱們肯定要監(jiān)控,除了springboot內(nèi)嵌的監(jiān)控機(jī)制以外,還可以用springboot admin來進(jìn)行更加完善的監(jiān)控。
<!-- 在pom.xml中添加Spring Boot Admin Client依賴 -->
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
</dependency>
12. 使用Spring Cloud構(gòu)建微服務(wù)
SpringBoot與Spring Cloud的結(jié)合,可以讓你輕松地構(gòu)建微服務(wù)架構(gòu)的應(yīng)用。Spring Cloud提供了服務(wù)發(fā)現(xiàn)、配置中心、消息總線、負(fù)載均衡等微服務(wù)所需的組件。如果我們開發(fā)的系統(tǒng)要拆分多個子系統(tǒng),或者是多個服務(wù),引入多人團(tuán)隊(duì)來協(xié)作開發(fā),那肯定會引入微服務(wù)框架,要不然用springcloud原生技術(shù)棧,要不然用springcloud alibaba技術(shù)棧,這塊都是可以讓我們的系統(tǒng)變得更好,對不對?
@SpringBootApplication
@EnableDiscoveryClient
public class MicroserviceApplication {
public static void main(String[] args) {
SpringApplication.run(MicroserviceApplication.class, args);
}
}
13. 使用Spring Boot Test進(jìn)行集成測試
SpringBoot提供了強(qiáng)大的測試支持,你可以使用@SpringBootTest注解來進(jìn)行集成測試,還可以使用@MockBean、@SpyBean等注解來模擬依賴。這個其實(shí)很有用,因?yàn)槲覀兤綍r寫好了代碼以后要進(jìn)行測試,一般就是單元測試、冒煙測試、集成測試、驗(yàn)收測試等,那其實(shí)用springboot test框架可以更加方便的幫助我們進(jìn)行各類代碼測試。
@SpringBootTest
public class BookServiceTests {
@Autowired
private BookService bookService;
@Test
public void testFindBook() {
Book book = bookService.findBook("1234567890");
assertNotNull(book);
assertEquals("Spring Boot in Action", book.getTitle());
}
}
14. 使用Docker容器化部署
SpringBoot應(yīng)用可以很容易地容器化部署,使用Docker可以讓你的應(yīng)用在任何支持Docker的平臺上運(yùn)行。這個容器部署其實(shí)是現(xiàn)在非常流行的一種部署方式,說白了就是我們的系統(tǒng)每次部署 一般都要設(shè)置各種參數(shù),可能還要攜帶各種配置,或者相關(guān)的一些其他東西,那其實(shí)如果每次部署多加一臺機(jī)器都要在機(jī)器里重新進(jìn)行環(huán)境配置等繁瑣操作,現(xiàn)在我們可以把這個工程和依賴的其他東西做成一個docker鏡像。
然后線上部署的時候再新的機(jī)器上直接安裝docker環(huán)境,基于我們的docker鏡像就可以一鍵部署系統(tǒng)了,是不是?相當(dāng)?shù)姆奖悖?/p>
# Dockerfile
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
總結(jié)
以上就是14個SpringBoot相關(guān)的優(yōu)化小妙招,希望它們能讓你的代碼不僅跑得快,還寫得像首詩一樣美。SpringBoot的強(qiáng)大之處不僅僅在于它的簡潔和易用,更在于它背后的一套完整的生態(tài)體系。掌握這些優(yōu)化技巧,你將能更加高效地開發(fā)SpringBoot應(yīng)用,享受編碼的樂趣。