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的注解对照表
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


猜你喜欢
- 上一篇说到Springboot整合Netty,自定义协议实现,本文聊一些拆包/沾包问题。拆包/沾包问题TCP是面向字节流的协议,在发送方发送
- 本文实例讲述了C#预处理器指令的用法。分享给大家供大家参考。具体用法分析如下:C#预处理器指令是在编译时调用的。预处理器指令(preproc
- 本文实例讲述了Android开发中使用颜色矩阵改变图片颜色,透明度及亮度的方法。分享给大家供大家参考,具体如下:一、如图二、代码实现publ
- 使用ViewPager实现屏幕滑动从一个完整的屏幕移动到另一个屏幕的过程被称为屏幕滑动,在安装向导、幻灯片中应用广泛。下面介绍如何利用And
- HashMap的get()方法的NullPointerException今天写代码发现一个 bug,HashMap的 get() 方法一直报
- 在使用ListView组件来显示列表数据时,有的时候我们需要改变列表中的数据,有以下方法:1、重新给ListView组件设置适配器这种方法重
- 一、前言我们先来看下面一个例子:using System;using System.Threading;namespace ThreadSy
- 本文基于ThreadLocal原理,实现了一个上下文状态管理组件Scope,通过开启一个自定义的Scope,在Scope范围内,可以通过Sc
- 开发背景开发工具:VS2017语言:C#DotNet版本:.Net FrameWork 4.0及以上系统:Win10 X64一、首先建立一个
- 一、引入类型别名当配置 XML 文件,需要指明Java类型时,类型别名可替代Java类型的全名,一般会设置一个简单缩写的类型别名去替代它,用
- 本文就是会将数组里面的单词进行倒序排列 例如 how old are you -> you are old how示例程序输出结果:t
- 一、需求背景有时候,我们需要在屏幕上显示新的信息,同时移除旧的信息,一般情况下我们通过VISIBILITY或者GONE来对需要显示或者隐藏的
- 如果项目中使用到了MyBatis框架,那么使用通用Mapper和PageHelper分页插件将极大的简化我们的操作。通用Mapper可以简化
- 本文实例为大家分享了java利用udp实现发送数据的具体代码,供大家参考,具体内容如下1.udp的特点数据以包的形式发送数据udp是面向无连
- 概述在Compose中,图片组件主要有两种,分别是显示图标的Icon组件和显示图片的Image组件,当我们显示一系列的小图标的时候,我们可以
- Java读文件修改默认换行符Java默认换行符是'\n'。但有时数据并不以'\n'进行换行方法如下publi
- 单例模式单例模式顾名思义就是单一的实例,涉及到一个单一的类,该类负责创建自己的对象,同时确保只有一个对象被创建,并且提供一种可以访问这个对象
- 一、二维数组进入正题之前.首先为了便于大家理解,我画了一个图:xx枪战游戏中, 我是一个刚刚注册账号的小白,系统送了我两把枪,此时,我的武器
- 一、Java类的加载顺序引用1个网上的经典例子,并做稍许改动,以便大家更好地理解。public class Animal {
- java有四种访问控制修饰符。publicprotectedprivatedefault(默认为空,不加任何修饰)为了用代码对比出其中的区别