14個SpringBoot優化小妙招,寫代碼像寫詩
今天我們來分享一下平時用SpringBoot開發時候的一些優化小妙招,用好這些優化小妙招讓我們開發的系統架構、系統代碼、開發流程、測試流程、運維監控看起來就跟寫詩一樣優雅,讓我們每個人手頭負責的代碼和工程都要很漂亮~~~
這里的優化小妙招很多不是說直接對springboot來優化,有些是對springboot自己的優雅特性做一些總結,幫助大家更加系統全面的了解springboot開發的時候,如何做可以讓我們的代碼和系統更加的優雅。
當然,因為要分享的優化小妙招很多,我們更多的是給大家展示一下優化的一些點和思路,具體的使用大家如果要落地,還得自己查閱官網資料!
1. 使用@SpringBootApplication注解簡化配置
SpringBoot提倡“約定大于配置”,而@SpringBootApplication注解正是這一理念的體現。它集成了@Configuration、@EnableAutoConfiguration、@ComponentScan三個注解,讓你的主類配置瞬間簡潔明了。
說實話,一般來說我們都是用springboot來開發系統的時候,都是默認都加@SpringBootApplication注解的,這個倒不能說是優化小妙招,更多的是給大家引入一下這個注解,我們可以學習一下springboot框架這種優雅的設計理念。
也就是說,SpringBoot為了盡最大可能去簡化一個web系統的啟動,設計了SpringApplication啟動類一鍵啟動一個web系統,所有的web server、spring容器、bean管理、三方組件管理、擴展組件管理,其實都是默認行為去管控的,最大簡化我們的系統開發,搭配上一些注解的使用,就從頭開始就讓我們的系統非常優雅!
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
2. 利用配置文件簡化代碼
SpringBoot支持多種格式的配置文件,如application.properties和application.yml。你可以將一些配置信息放在這里,減少硬編碼,讓代碼更加靈活。
這個說實話一般人用springboot開發系統也都是加配置文件的,畢竟配置信息不要寫死在代碼里,把配置信息放外部配置文件,這樣才能優雅,而且一般還可以搭配springboot的profile功能把不同環境的配置文件區分開來,部署的時候指定一個環境就可以了。
# application.yml
server:
port: 8080
my:
greeting: Hello, World!
@Value("${my.greeting}")
private String greeting;
3. 使用Actuator監控應用
SpringBoot Actuator提供了很多內置的端點,讓你能夠監控和管理應用。比如/health端點可以告訴你應用的健康狀態,/metrics端點則提供了各種度量信息。
這個其實就是系統上線以后我們是需要對系統進行監控的,那一般小公司沒有大公司完善的基礎設施,如果我們要快速開發和部署一個系統上線,其實可以直接用springboot自帶的監控功能來對線上系統進行基礎的監控。
<!-- 在pom.xml中添加Actuator依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
4. 異步處理提升性能
SpringBoot支持異步處理,你可以使用@Async注解來異步執行方法,提升應用的性能和響應速度,這個是一個好功能,如果執行異步功能,一般我們都要自己開線程去執行異步任務,但是用異步注解可以由框架啟動一個內嵌的異步任務執行我們的代碼邏輯,這個相當優雅,有沒有?代碼是不是很漂亮!
@Service
public class AsyncService {
@Async
public void executeAsyncTask() {
// 執行異步任務
}
}
5. 利用緩存減少數據庫訪問
SpringBoot支持多種緩存抽象,如ConcurrentMap、EhCache、Redis等。使用緩存可以減少對數據庫的訪問,提高應用的性能。以前咱們用緩存的時候,那肯定是要自己封裝緩存組件的,完了在封裝好的緩存組件里基于開源的緩存系統的客戶端來實現各類功能,對吧,然后再代碼里是不是我們還得自己動手編寫緩存讀寫的代碼邏輯?
好,那現在我們可以用@CacheConfig、@Cacheable等注解直接讓框架去托管緩存的讀寫,自動把數據庫查詢結果進行緩存,以及下次查找的時候自動讀取緩存,是不是感覺很方便?就省去了自己寫緩存讀寫代碼的過程了,又變得優雅了有沒有~~~
@Service
@CacheConfig(cacheNames = "books")
public class BookService {
@Cacheable
public Book findBook(ISBN isbn) {
// 模擬耗時操作
return findBookFromDatabase(isbn);
}
}
6. 使用JPA簡化數據庫操作
SpringBoot與Spring Data JPA結合,可以讓你用非常簡潔的代碼完成復雜的數據庫操作。咱們平時要是封裝數據庫操作,是不是得自己動手搞?那現在直接用Spring Data JPA來做數據庫操作的ORM,是不是感覺方便了很多?
以前我們得自己寫sql語句,自己做數據的增刪改查,現在都是面向對象編寫數據庫操作邏輯,框架底層自動托管生成sql語句去做數據庫的增刪改查,是不是很優雅很方便?
public interface BookRepository extends JpaRepository<Book, Long> {
List<Book> findByAuthor(String author);
}
7. 優化RESTful API設計
RESTful API的設計應該簡潔、直觀。使用SpringBoot,你可以很容易地創建RESTful API,并使用Swagger等工具進行文檔生成和測試。這個功能實在是太常用了,沒用springboot的時候,其實咱們還得自己整合ssm框架,完了去用springmvc開發web接口,現在用了springboot以后,內嵌就幫我們搞定了spring和springmvc的框架整合這些事情,直接上手編寫web接口,一鍵啟動啟動就可以對外提供http接口了,很方便有沒有~~~
@RestController
@RequestMapping("/books")
public class BookController {
@GetMapping("/{id}")
public ResponseEntity<Book> getBook(@PathVariable Long id) {
// 獲取書籍并返回
}
}
8. 使用Spring Security保護應用
SpringBoot與Spring Security的結合,可以讓你輕松地保護你的應用。你可以配置用戶、角色、權限等,還可以使用OAuth2、JWT等高級特性。所謂的安全性保護,說白了就是我們寫好的系統發布上線了,不能隨便誰都可以來調用接口吧?不能隨便誰來提交數據我們都允許修改系統數據庫里的數據吧?不能隨便誰來查詢數據我們都開放給他查詢吧?
那是不是得有一套安全防護機制?比如說限制一下哪些http接口路徑要進行防護,我們防護的時候是怎么防護,是不是說要求請求方必須攜帶用戶token信息,然后是不是要對請求里帶的token信息進行有效校驗、權限校驗?必須是我們允許的用戶攜帶了有效的校驗信息,我們才可以允許他來請求系統,是不是?
那所以這塊是不是可以跟spring security框架整合,直接把防護性功能給做了?
@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庫,它可以自動插入編輯器并構建工具,簡化Java模型類的編寫。使用Lombok,你可以省去getter、setter、構造器等方法的編寫。這個lombok框架還是很方便的,因為我們有了他,就不用動手寫一大堆的冗余方法了,讓我們的代碼更加簡潔明了,domain領域對象可以專注自己的屬性就可以了。
@Data
public class Book {
private Long id;
private String title;
private String author;
}
10. 使用MapStruct處理對象映射
MapStruct是一個代碼生成器,它基于約定優于配置的原則,可以在Java bean類型之間自動實現映射。使用MapStruct,你可以避免手動編寫繁瑣的映射代碼。這個框架也是相當的有用,我們如果要是在一些VO、DO、DTO等對象之間進行對象轉換,不用自己動手封裝轉換邏輯了,直接用這個框架就可以實現對象轉換了,很優雅有么有~~~
@Mapper
public interface BookMapper {
BookMapper INSTANCE = Mappers.getMapper(BookMapper.class);
BookDto toDto(Book entity);
Book toEntity(BookDto dto);
}
11. 使用Spring Boot Admin監控多個應用
Spring Boot Admin是一個開源社區項目,用于管理和監控基于Spring Boot的應用。它可以顯示應用的健康狀態、度量信息、環境屬性等。這個就跟我們上面說的一樣,springboot快速開發一個系統然后發布上線,咱們肯定要監控,除了springboot內嵌的監控機制以外,還可以用springboot admin來進行更加完善的監控。
<!-- 在pom.xml中添加Spring Boot Admin Client依賴 -->
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
</dependency>
12. 使用Spring Cloud構建微服務
SpringBoot與Spring Cloud的結合,可以讓你輕松地構建微服務架構的應用。Spring Cloud提供了服務發現、配置中心、消息總線、負載均衡等微服務所需的組件。如果我們開發的系統要拆分多個子系統,或者是多個服務,引入多人團隊來協作開發,那肯定會引入微服務框架,要不然用springcloud原生技術棧,要不然用springcloud alibaba技術棧,這塊都是可以讓我們的系統變得更好,對不對?
@SpringBootApplication
@EnableDiscoveryClient
public class MicroserviceApplication {
public static void main(String[] args) {
SpringApplication.run(MicroserviceApplication.class, args);
}
}
13. 使用Spring Boot Test進行集成測試
SpringBoot提供了強大的測試支持,你可以使用@SpringBootTest注解來進行集成測試,還可以使用@MockBean、@SpyBean等注解來模擬依賴。這個其實很有用,因為我們平時寫好了代碼以后要進行測試,一般就是單元測試、冒煙測試、集成測試、驗收測試等,那其實用springboot test框架可以更加方便的幫助我們進行各類代碼測試。
@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應用可以很容易地容器化部署,使用Docker可以讓你的應用在任何支持Docker的平臺上運行。這個容器部署其實是現在非常流行的一種部署方式,說白了就是我們的系統每次部署 一般都要設置各種參數,可能還要攜帶各種配置,或者相關的一些其他東西,那其實如果每次部署多加一臺機器都要在機器里重新進行環境配置等繁瑣操作,現在我們可以把這個工程和依賴的其他東西做成一個docker鏡像。
然后線上部署的時候再新的機器上直接安裝docker環境,基于我們的docker鏡像就可以一鍵部署系統了,是不是?相當的方便!
# 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"]
總結
以上就是14個SpringBoot相關的優化小妙招,希望它們能讓你的代碼不僅跑得快,還寫得像首詩一樣美。SpringBoot的強大之處不僅僅在于它的簡潔和易用,更在于它背后的一套完整的生態體系。掌握這些優化技巧,你將能更加高效地開發SpringBoot應用,享受編碼的樂趣。