Quarkus的Spring扩展快速改造Spring项目

作者:kl 时间:2023-11-26 03:01:58 

前言

博主上个礼拜,已经实现了quarkus的native image应用的上线,经过两天的监控下来,一切运行指标良好,就是内存升到了100M了,这个后续继续跟进观察。今天聊点老的spring应用改造成quarkus的问题。一个新的框架是否可以顺利的在一个公司落地,除了本身优秀的设计和优异的性能外,框架的生态和上手的难度以及对现有框架的兼容性都是非常重要的考量因素,在quarkus之前,使用最广泛的web框架就是spring webmvc框架了,数据访问层用的多的也是spring data jpa等。quarkus充分考虑了这种spring用户的需求,官方出品了多个针对spring环境的迁移扩展包,有了这些spring扩展,可以非常轻松的从spring应用迁移到quarkus平台上来。

spring-webmvc扩展

添加扩展依赖

<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扩展常用的spring注解基本都支持了,但是使用时要注意,有些用法可能稍微有点不兼容,比如GET请求参数映射,纯spring环境下,可以不用@RequestParam注解绑定,但是quarkus环境下就必须使用@RequestParam注解绑定入参,还有spring下的MultipartFile不支持,涉及到表单文件上传的场景必须要改成JAX-RS的标准模式才行,这块会单独来写。

spring-datajpa扩展

添加扩展依赖

<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的默认命名策略,spring-data-jpa扩展包也提供了支持,只需要设置以下属性:

quarkus.hibernate-orm.physical-naming-strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy

博主之前没了解到spring扩展之前,也遇到了相同的问题,最后只能从spring将命名策略拷贝到本工程里。不得不说quarkus想的还是蛮周到的

spring-Di扩展

添加扩展依赖

<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);
   }
}

以上示例了最基础的用法,声明一个服务的@service、@Compoment等都支持,下面是支持的spring注解和JAX-RS的注解对照表

Quarkus的Spring扩展快速改造Spring项目

spring-boot-properties扩展

添加扩展依赖

<dependency>
   <groupId>io.quarkus</groupId>
   <artifactId>quarkus-spring-boot-properties</artifactId>
</dependency>

支持以下spring配置方式

@ConfigurationProperties("greeting")
public class GreetingProperties {
   public String text;
}

来源:http://www.kailing.pub/article/index/arcid/299.html

标签:Quarkus,Spring,项目改造
0
投稿

猜你喜欢

  • Android MVP模式实战教程

    2023-09-05 13:16:54
  • C#如何优雅的结束线程

    2022-07-27 19:45:27
  • android 多点触摸图片缩放的具体实现方法

    2023-03-14 05:49:31
  • Java 多线程使用要点分析

    2023-12-18 22:41:36
  • C#实现DataSet内数据转化为Excel和Word文件的通用类完整实例

    2023-05-29 21:50:02
  • WPF使用DrawingContext实现绘制刻度条

    2023-06-19 08:35:17
  • 获取Android签名证书的公钥和私钥的简单实例

    2022-10-02 22:20:13
  • 利用Java生成带有文字的二维码

    2022-05-21 15:01:38
  • SpringMVC适配器模式作用范围介绍

    2023-12-10 23:37:15
  • 一篇文章弄懂Spring MVC的参数绑定

    2023-09-17 01:01:21
  • Java 实现汉字转换为拼音的实例

    2022-08-28 01:10:40
  • IDEA报错:无效的源发行版解决方案

    2022-06-05 08:38:58
  • mongo分布式锁Java实现方法(推荐)

    2023-06-30 21:28:43
  • 解析C#中的装箱与拆箱的详解

    2023-03-15 23:52:36
  • C#绘制饼状图和柱状图的方法

    2023-12-19 15:42:59
  • Java读取properties配置文件的8种方式汇总

    2022-05-03 17:11:34
  • Java分布式事务管理框架之Seata

    2023-09-28 11:50:36
  • SpringBoot浅析Redis访问操作使用

    2022-09-26 02:09:18
  • Java构造器与传值学习总结

    2023-03-08 23:18:06
  • Flutter 日历组件简单实现

    2023-10-21 11:04:35
  • asp之家 软件编程 m.aspxhome.com