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

目录
  • 前言
  • spring-webmvc扩展
  • spring-datajpa扩展
  • spring-Di扩展
  • spring-boot-properties扩展
  • 结语

前言

博主上个礼拜,已经实现了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;
}

结语

quarkus的这些spring扩展,看上去就和spring一样,其实底层实现完全不一样,quarkus并没有引入spring的bean、context等容器上下文,这些扩展仅仅是作为注解元数据信息使用而已。以上列举了四种常见的spring使用扩展支持,quarkus支持的扩展还有Spring-ScheduledSpring-CacheSpring-SecuritySpring Cloud Config Server,这里就不一一列举了,可以点击链接查看官方的文档。随着quarkus社区的迭代,spring扩展兼容支持会越来愈好越来越多,不过那个时候也有可能spring boot也追赶上了GraalVm,无论怎样,对于我们开发者而言,多个选择总是好的。

以上就是Quarkus的Spring扩展快速改造Spring项目的详细内容,更多关于Quarkus扩展改造Spring项目的资料请关注我们其它相关文章!

(0)

相关推荐

  • Quarkus篇入门创建项目搭建debug环境

    目录 前言 搭建Quarkus项目 纯手工方式 官网装配器方式 IDEA方式 编写第一个Quarkus接口 启动你的应用并调试 前言 在学习一个新的框架技术前,肯定要先来一套hello word,搭建基本的运行环境和调试环境. 先来创建一个Quarkus的应用 搭建Quarkus项目 下面介绍三种创建Quarkus项目的方式 纯手工方式 1.创建maven工程,这个不多赘述,是个java程序员都会的 2.添加Quarkus依赖,下面贴出基本的依赖 <properties> <quarku

  • Quarkus中实现Resteasy的文件上传下载操作

    目录 前言 文件上传 文件下载 前言 做java web开发,文件的上传和下载是一个非常常见的需求场景.在spring生态下的文件上传下载非常简单,记得五年前,我刚写博的时候也写过spring的上传和下载<SpringMvc实现文件上传与下载>,以及Struts2的文件上传和下载<java Struts2实现文件上传下载>.今天来看看Quarkus框架中是如何实现的,因为Quarkus的JAX-RS采用Resteasy的实现,故Quarkus中的文件上传和下载,也就是Resteas

  • Quarkus集成redis操作Redisson实现数据互通

    目录 前言 集成redis 复制Redisson序列化 使用 前言 博主所在公司大量使用了redis缓存,redis客户端用的Redisson.在Quarkus集成redis时,博主尝试使用Redisson客户端直接集成,发现,在jvm模式下运行quarkus没点问题,但是在打native image时,就报错了,尝试了很多方式都是莫名其妙的异常.最后决定采用quarkus官方的redis客户端,但是Redisson客户端数据序列化方式是特有的,不是简单的String,所以quarkus中的re

  • Quarkus云原生开篇java框架简介

    目录 前言 什么是quarkus? 为什么用quarkus? 专为开发人员而设计 容器优先 命令式和响应式代码 结语 前言 Quarkus 是小红帽开源的专门针对云容器环境优化的云原生java框架,目前已迭代到1.6.0版本,已完成了大部分的框架库的集成扩展,为了让你低成本迁移到Quarkus来,它兼容主流的框架开发模式api,如spring web. Quarkus已具备企业级应用开发能力.而且未来容器云肯定是主流了,可以预见,未来的软件都是运行在k8s这样的容器集群里.而容器环境需要应用具备

  • Quarkus改造Pmml模型项目异常记录及解决处理

    目录 前言 异常如下: 解决 解决思路 stax-api百科 总结 前言 这个项目是一个PMML模型跑分系统,在使用quarkus架构对其改造的过程中,在加载PMML模型时,抛了一个异常,在网上找了很多资料都没有解决,pmml项目的issue中也没有找到相关的内容,故在此记录下,给遇到问题的你做个参考 jpmml-evaluator:https://github.com/jpmml/jpmml-evaluator 异常如下: java.lang.LinkageError: loader cons

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

    目录 前言 spring-webmvc扩展 spring-datajpa扩展 spring-Di扩展 spring-boot-properties扩展 结语 前言 博主上个礼拜,已经实现了quarkus的native image应用的上线,经过两天的监控下来,一切运行指标良好,就是内存升到了100M了,这个后续继续跟进观察.今天聊点老的spring应用改造成quarkus的问题.一个新的框架是否可以顺利的在一个公司落地,除了本身优秀的设计和优异的性能外,框架的生态和上手的难度以及对现有框架的兼容

  • idea使用spring Initializr 快速搭建springboot项目遇到的坑

    前言: 以前用习惯了sts,今天尝试使用IDEA 搭建springboot项目工程,却遇到了个小坑.不知道你们是否遇到过,分享如下: 首先我的maven使用的是3.5.3 首先创建springboot: 使用的是默认spring官网的镜像.这里改动不大. 选了个web. 项目创建成功 在启动类右键,没有run方法 在pom.xml上右键,将其添加为maven项目 然后发现Test模块报错. 查看pom.xml文件,发现2.3.5Release版本变红,怀疑是版本不对应问题. 创建时发现没有2.3

  • Spring Boot快速搭建Spring框架教程

    Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来. 它是为了解决企业应用开发的复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架.Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情. 然而,Spr

  • idea快速搭建spring cloud注册中心与注册的方法

    spring cloud快速搭建 Spring Cloud是一个微服务框架,它基于spring boot, Spring Cloud提供的全套的分布式系统解决方案 . 首先我们使用gradle来创建: 选择JDK以及勾选Java,然后下一步 起包名已经项目名,下一步: 选择我们本地的gradle包,一直下一步,点击build.gradle并添加我们的依赖: group 'com.gaofei' version '1.0-SNAPSHOT' //gradle使用的插件 apply plugin:

  • ssm项目改造spring boot项目完整步骤

    目录 添加依赖 添加启动类 拷贝项目代码 配置数据库连接池 添加依赖 连接池的自动配置方式 配置 Druid 连接池 集成 MyBatis 添加依赖 配置 Mapper 对象 MyBatis配置属性 事务管理 添加依赖 注解方式 配置切换代理 测试验证 集成 Web 添加依赖 修改端口 目录结构 静态资源的一些处理 前端控制器映射路径配置 集成 Thymeleaf 添加依赖 相关配置 修改模板文件 统一异常处理 框架自带方式 控制器增强器方式 添加注册多个拦截器 系统日志 为什么要用日志 Spr

  • 详解用Spring Boot零配置快速创建web项目

    一.Spring Boot简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过这种方式,Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者. 本文是一个springboot入门级的helloworld程序. 二.maven安装与配置 下载地址:http://maven.apache

  • 5分钟快速创建spring boot项目的完整步骤

    前言 上一篇博客说了如何创建spring boot项目,但是有些同学会觉得有点麻烦,有没有什么快速学会能快速创建spring boot项目的方法,答案是肯定的.接下来我们就一起来快速创建一个spring boot项目并让它跑起来. 我们今天用两种方式创建,分别是在线创建和使用IntelliJ IDEA创建. 1 在线创建 1.1 在浏览器中打开https://start.spring.io/,我们看到的是如下图所示: 1.2 Project选择Maven Project,Language选择Ja

  • 快速搭建Spring Boot+MyBatis的项目IDEA(附源码下载)

    如何快速构建一个Spring Boot的项目工具 ideaJDK版本 1.8Spring Boot 版本 1.5.9环境搭建实现:最基础前端可以访问到数据库内的内容 开始 1.IDEA 内部新建一个项目,项目类型选择Spring Initializr,Project SDK选择适合你当前环境的版本,这里我选择的是1.8(Spring Boot 2.0以上的版本,JDK选择请选择1.8即以上版本),构建服务选择默认就好,点击Next 2.填写Group和Artifact(此处我使用的是默认,请根据

  • 通过IEAD+Maven快速搭建SSM项目的过程(Spring + Spring MVC + Mybatis)

    项目效果预览: 通过访问控制层的test/dologin方法进入index.jsp,展示jsp中的"hello,ssm"内容 一.新建项目: 1.打开IDEA,新建一个Maven项目 2.点击next,新建一个为ssmDemo的Maven项目(自己定义项目GroupId和ArtifactId) 3.配置本地Maven路径 4.点击Next,确认项目信息,配置项目名称和项目路径,点击Finish按钮即可创建项目 5.项目创建完成,目录结构如下: 注:如项目目录中未包含src,则项目还在初

  • IDEA快速搭建spring boot项目教程(Spring initializr)

    目录 IDEA快速搭建spring boot项目 1.创建项目 2.编写控制器 3.运行项目 IDEA添加配置SpringBoot Spring Initializr工具 1.点击file–点击settings–点击plugins 2.搜索spring – 找到Spring Assistant 3.点击install,等待加载完成后重启idea IDEA快速搭建spring boot项目 1.创建项目 老规矩,点击Create New Project 2.编写控制器 在com.demo.spri

随机推荐