Quarkus的Spring擴(kuò)展快速改造Spring項(xiàng)目
前言
博主上個(gè)禮拜,已經(jīng)實(shí)現(xiàn)了quarkus的native image應(yīng)用的上線,經(jīng)過兩天的監(jiān)控下來,一切運(yùn)行指標(biāo)良好,就是內(nèi)存升到了100M了,這個(gè)后續(xù)繼續(xù)跟進(jìn)觀察。今天聊點(diǎn)老的spring應(yīng)用改造成quarkus的問題。一個(gè)新的框架是否可以順利的在一個(gè)公司落地,除了本身優(yōu)秀的設(shè)計(jì)和優(yōu)異的性能外,框架的生態(tài)和上手的難度以及對(duì)現(xiàn)有框架的兼容性都是非常重要的考量因素,在quarkus之前,使用最廣泛的web框架就是spring webmvc框架了,數(shù)據(jù)訪問層用的多的也是spring data jpa等。quarkus充分考慮了這種spring用戶的需求,官方出品了多個(gè)針對(duì)spring環(huán)境的遷移擴(kuò)展包,有了這些spring擴(kuò)展,可以非常輕松的從spring應(yīng)用遷移到quarkus平臺(tái)上來。
spring-webmvc擴(kuò)展
添加擴(kuò)展依賴
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-spring-web</artifactId>
</dependency>兼容以下spring的注解用法
@RestController
@RequestMapping("/test")
public class TestController {
@GetMapping("/hello")
public String hello(@RequestParam("name") String name){
return "hello" + name;
}
@PostMapping("/hello")
public String hello1(@RequestBody Hello hello){
return "hello" + hello.getName();
}
@GetMapping("/{name}")
public String hello2(@PathVariable(name = "name") String name) {
return "hello" + name;
}
class Hello{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}以上示例了最基本的restfull接口用法,quarkus的spring-web擴(kuò)展常用的spring注解基本都支持了,但是使用時(shí)要注意,有些用法可能稍微有點(diǎn)不兼容,比如GET請(qǐng)求參數(shù)映射,純spring環(huán)境下,可以不用@RequestParam注解綁定,但是quarkus環(huán)境下就必須使用@RequestParam注解綁定入?yún)?,還有spring下的MultipartFile不支持,涉及到表單文件上傳的場(chǎng)景必須要改成JAX-RS的標(biāo)準(zhǔn)模式才行,這塊會(huì)單獨(dú)來寫。
spring-datajpa擴(kuò)展
添加擴(kuò)展依賴
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-spring-data-jpa</artifactId>
</dependency>兼容以下spring-data-jpa的用法
public interface MovieRepository extends CrudRepository<Movie, Long> {
Movie findFirstByOrderByDurationDesc();
@Query("select m from Movie m where m.rating = ?1")
Iterator<Movie> findByRating(String rating);
@Query("from Movie where title = ?1")
Movie findByTitle(String title);
@Query("select m from Movie m where m.duration > :duration and m.rating = :rating")
List<Movie> withRatingAndDurationLargerThan(@Param("duration") int duration, @Param("rating") String rating);
@Query("from Movie where title like concat('%', ?1, '%')")
List<Object[]> someFieldsWithTitleLike(String title, Sort sort);
@Modifying
@Query("delete from Movie where rating = :rating")
void deleteByRating(@Param("rating") String rating);
@Modifying
@Query("delete from Movie where title like concat('%', ?1, '%')")
Long deleteByTitleLike(String title);
@Modifying
@Query("update Movie m set m.rating = :newName where m.rating = :oldName")
int changeRatingToNewName(@Param("newName") String newName, @Param("oldName") String oldName);
@Modifying
@Query("update Movie set rating = null where title =?1")
void setRatingToNullForTitle(String title);
@Query("from Movie order by length(title)")
Slice<Movie> orderByTitleLength(Pageable pageable);
}如下的接口定義都支持
org.springframework.data.repository.Repository
org.springframework.data.repository.CrudRepository
org.springframework.data.repository.PagingAndSortingRepository
org.springframework.data.jpa.repository.JpaRepository
Hibernate ORM使用物理命名策略和隱式命名策略來映射屬性名稱。如果您希望使用Spring Boot的默認(rèn)命名策略,spring-data-jpa擴(kuò)展包也提供了支持,只需要設(shè)置以下屬性:
quarkus.hibernate-orm.physical-naming-strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
博主之前沒了解到spring擴(kuò)展之前,也遇到了相同的問題,最后只能從spring將命名策略拷貝到本工程里。不得不說quarkus想的還是蠻周到的
spring-Di擴(kuò)展
添加擴(kuò)展依賴
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-spring-di</artifactId>
</dependency>兼容以下IOC用法
@Configuration
public class TestConfig {
@Autowired
private AccountRepository repository;
@Value("${acc}")
private String acc;
@Bean
AccountService accountService() {
return new AccountService(repository);
}
}以上示例了最基礎(chǔ)的用法,聲明一個(gè)服務(wù)的@service、@Compoment等都支持,下面是支持的spring注解和JAX-RS的注解對(duì)照表

spring-boot-properties擴(kuò)展
添加擴(kuò)展依賴
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-spring-boot-properties</artifactId>
</dependency>支持以下spring配置方式
@ConfigurationProperties("greeting")
public class GreetingProperties {
public String text;
}結(jié)語(yǔ)
quarkus的這些spring擴(kuò)展,看上去就和spring一樣,其實(shí)底層實(shí)現(xiàn)完全不一樣,quarkus并沒有引入spring的bean、context等容器上下文,這些擴(kuò)展僅僅是作為注解元數(shù)據(jù)信息使用而已。以上列舉了四種常見的spring使用擴(kuò)展支持,quarkus支持的擴(kuò)展還有Spring-Scheduled、Spring-Cache、Spring-Security、Spring Cloud Config Server,這里就不一一列舉了,可以點(diǎn)擊鏈接查看官方的文檔。隨著quarkus社區(qū)的迭代,spring擴(kuò)展兼容支持會(huì)越來愈好越來越多,不過那個(gè)時(shí)候也有可能spring boot也追趕上了GraalVm,無論怎樣,對(duì)于我們開發(fā)者而言,多個(gè)選擇總是好的。
以上就是Quarkus的Spring擴(kuò)展快速改造Spring項(xiàng)目的詳細(xì)內(nèi)容,更多關(guān)于Quarkus擴(kuò)展改造Spring項(xiàng)目的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java模擬實(shí)現(xiàn)QQ三方登錄(單點(diǎn)登錄2.0)
這篇文章主要為大家詳細(xì)介紹了Java模擬實(shí)現(xiàn)QQ三方登錄,單點(diǎn)登錄2.0,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06
使用okhttp替換Feign默認(rèn)Client的操作
這篇文章主要介紹了使用okhttp替換Feign默認(rèn)Client的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-02-02
Java基于Socket實(shí)現(xiàn)多人聊天室
這篇文章主要為大家詳細(xì)介紹了Java基于Socket實(shí)現(xiàn)多人聊天室,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-09-09
SpringBoot整合Apache Ignite的實(shí)現(xiàn)
本文主要介紹了SpringBoot整合Apache Ignite的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10
Spring?Boot自定義Starter組件開發(fā)實(shí)現(xiàn)配置過程
SpringBoot中的starter是一種非常重要的機(jī)制,能夠拋棄以前繁雜的配置,將其統(tǒng)一集成進(jìn)?starter,應(yīng)用者只需要在maven中引入starter依賴,這篇文章主要介紹了Spring?Boot自定義Starter組件開發(fā)實(shí)現(xiàn),需要的朋友可以參考下2022-06-06
SpringBoot接收參數(shù)所有方式總結(jié)
這篇文章主要介紹了SpringBoot接收參數(shù)所有方式總結(jié),文中通過代碼示例和圖文結(jié)合的方式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-07-07
Java數(shù)據(jù)庫(kù)連接池連接Oracle過程詳解
這篇文章主要介紹了Java數(shù)據(jù)庫(kù)連接池連接Oracle過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
Filter中獲取傳遞參數(shù)方式(解決post請(qǐng)求參數(shù)問題)
這篇文章主要介紹了Filter中獲取傳遞參數(shù)方式(解決post請(qǐng)求參數(shù)問題),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08

