您现在的位置是:首页 >技术交流 >从SpringBoot迁移到Quarkus网站首页技术交流

从SpringBoot迁移到Quarkus

tq1086 2024-06-12 18:01:02
简介从SpringBoot迁移到Quarkus

从SpringBoot迁移到Quarkus

近期将一个小程序从Spring boot迁移到了Quarkus。之所以决定进行迁移,一是想尝试一些新的Java语法和框架;二是程序比较小,迁移成本低。选择Quarkus的原因也有两点:一是对native image的支持较好。二是对Java标准的支持较好。

Quarkus有一些扩展可以简化迁移工作,这些扩展可以在这里找到。因为我的程序规模较小,加上我希望程序能更贴近标准,减少对特定API的依赖,因此我没有使用这些插件。

迁移工作主要有

  1. 通过gradle init将maven项目改造为gradle项目。
  2. 增加Quarkus依赖项。
  3. 增加hibernate、quarkus-hibernate-orm、mysql、mssql等Quarkus扩展。
  4. 将jakarta.persistence包替换为javax.persistence。
  5. 将@Service、@Controller、@Repository等注解替换为javax.enterprise.context.ApplicationScoped。
  6. 将@Autowired注解替换为@javax.inject.Inject。
  7. 将Entity改为Panache。删除Repository。或将Repository接口替换为io.quarkus.hibernate.orm.panache.PanacheRepository派生类(否则构建时会报 javax.enterprise.inject.spi.DeploymentException)。
  8. 修改调用Repository的地方。
  9. 删除cors interceptor,改为配置quarkus.http.cors=true。
  10. 将@RequestMapping(value="/create", method=RequestMethod.POST)注解改为@Path和@GET、@POST。
  11. 将XxxController重命名为XxxResource。
  12. 将重定向"redirect:/…"改为Response.temporaryRedirect(URI)。
  13. 将MultipartFile改为@Consumes(MediaType.MULTIPART_FORM_DATA)和@MultipartForm。增加resteasy-multipart扩展。
  14. 将MultiValueMap改为@MultipartForm。
  15. 将InitializingBean改为@Startup。
  16. 将@Value改为@ConfigProperty。
  17. 将@SpringBootApplication改为@QuarkusMain,将SpringApplication.run改为Quarkus.run。

一些替换脚本

# 将jakarta.*替换为javax.*。
find . -type f -name *.java -print -exec sed -i 's/jakarta/javax/g' {} +
# 将@Autowired替换为@Inject。
find . -type f -name *.java -print -exec sed -i 's/import org.springframework.beans.factory.annotation.Autowired/import javax.inject.Inject/g' {} +
find . -type f -name *.java -print -exec sed -i 's/Autowired/Inject/g' {} +
# 将@Service替换为@ApplicationScoped。
find . -type f -name *.java -print -exec sed -i 's/import org.springframework.stereotype.Service/import javax.enterprise.context.ApplicationScoped/g' {} +
find . -type f -name *.java -print -exec sed -i 's/@Service/@ApplicationScoped/g' {} +
# 取消@CrossOrigin。
find . -type f -name *.java -print -exec sed -i 's/import org.springframework.web.bind.annotation.CrossOrigin;//g' {} +
find . -type f -name *.java -print -exec sed -i 's/@CrossOrigin//g' {} +
# 将@Controller替换为@ApplicationScoped。
find . -type f -name *.java -print -exec sed -i 's/import org.springframework.stereotype.Controller/import javax.enterprise.context.ApplicationScoped/g' {} +
find . -type f -name *.java -print -exec sed -i 's/@Controller/@ApplicationScoped/g' {} +
# 取消@ResponseBody
find . -type f -name *.java -print -exec sed -i 's/import org.springframework.web.bind.annotation.ResponseBody;//g' {} +
find . -type f -name *.java -print -exec sed -i 's/@ResponseBody//g' {} +
# 将@RequestMapping替换为@Path。
find . -type f -name *.java -print -exec sed -i 's/import org.springframework.web.bind.annotation.RequestMapping;/import javax.ws.rs.Path;/g' {} +
find . -type f -name *.java -print -exec sed -i 's/@RequestMapping/@Path/g' {} +
# 将@RequestParam替换为@QueryParam。
find . -type f -name *.java -print -exec sed -i 's/import org.springframework.web.bind.annotation.RequestParam;/import javax.ws.rs.QueryParam;/g' {} +
find . -type f -name *.java -print -exec sed -i 's/@RequestParam/@QueryParam/g' {} +
# 取消import org.springframework.web.bind.annotation.RequestMethod;
find . -type f -name *.java -print -exec sed -i 's/import org.springframework.web.bind.annotation.RequestMethod;//g' {} +
# 将@Value替换为@ConfigProperty
find . -type f -name *.java -print -exec sed -i 's/import org.springframework.beans.factory.annotation.Value;/import org.eclipse.microprofile.config.inject.ConfigProperty;/g' {} +
find . -type f -name *.java -print -exec sed -i 's/@Value/@ConfigProperty/g' {} +
# 将@Repository改为@ApplicationScoped。
find . -type f -name *.java -print -exec sed -i 's/import org.springframework.stereotype.Repository/import javax.enterprise.context.ApplicationScoped/g' {} +
find . -type f -name *.java -print -exec sed -i 's/@Repository/@ApplicationScoped/g' {} +
# 将import org.springframework.data.jpa.repository.JpaRepository; 替换为io.quarkus.hibernate.orm.panache.PanacheRepositoryBase。
find . -type f -name *.java -print -exec sed -i 's/import org.springframework.data.jpa.repository.JpaRepository;/import io.quarkus.hibernate.orm.panache.PanacheRepositoryBase;/g' {} +
find . -type f -name *.java -print -exec sed -i 's/JpaRepository/PanacheRepositoryBase/g' {} +

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。