首页 > 作文

记一次Maven项目改造成SpringBoot项目的过程实践

更新时间:2023-04-06 02:18:57 阅读: 评论:0

背景概述

团队有一个项目,是maven构建的普通java项目。

项目没有使用spring,用到了mysql、mybatis,还有其他大数据技术,比如flink、pulsar。

项目里连接数据库的部分,需要用到多个配置文件,一个是mybatis配置文件,一个是数据库配置文件。如果用springboot可以简化为一个application.yml文件。

项目里打包方式复杂,依赖一个maven-asmble的插件,打出的包是两个jar,出现过由于配置文件读取方式的错误,导致jar包还运行不了。使用这个插件打包,还需要写一个自定义的配置文件,配置各个资源打包的参数。如果用springboot,直接引入spring-boot-maven-plugin,打出的就是可执行jar包,不需要繁琐的配置,不需要自己写读取配置的代码。

为什么要改造成springboot项目呢,因为springboot

简化配置,不用写这么多配置文件自动配置,引入starter依赖,可以自动把默认配置配好内嵌web容器自动版本管理,maven和starter配置使用生态集成容易,如果项目想要集成另外的能力,引一些starter依赖,少量的配置就可以快速接入

此外也是一次技术提升的机会,技术的优势,springboot早就熟烂了。 所以打算改造成s湖南二本pringboot项目。

过程

加依赖

改造过程一步步来, 先把springbootstarter引入进来

修改main方法所在类

在原先的main方法上加上注解

引入数据库依赖

首先把main函数中配置的数据库连接硬编码删除,后面将要使用application.yml来配置

启动类上加入mapper扫描

添加app话中秋作文lication.yml

sqlssionfactory空指针异常分析

启动测试,报错,数据库连接的地方报sqlssionfactory空指针异常

查看错误堆栈,项目启动的时候,会从rulefunction这个类的构造函数里面开始初始化资源。

tfields和textinfo这两个方法写在构造函数中,在类初始化时,就会调用,从数据库查初始化资源,

这两个方法内部会去查数据库获取基础资源,见下图

rulefunction初始化时,spring还没有帮我们将mybatisssionfactory类实例化,所以报了空指针异常。

改造mybatisssionfactory类

改造前的mybatisssionfactory类代码如下

这个mybatisssionfacto氢氧化钫ry类,是在main方法中去初始化的,main方法中调用mybatisssionfactory.init方法,传入配置文件和配置参数,从而初始化sqlsstionfactory。

改造的过程中,我们把main方法中调用mybatisssionfactory.init方法给删除了,导致sqlsstionfactory未初始化。

为什么不在main方法中调用mybatisssionfactory.init,从而初始化sqlsstionfactory?因为我希望通过spring注入和管理sqlsstionfactory的对象。

在static工具类方法里调用spring托管的bean对象[1]

这里遇到一个问题,注意sqlssionfactory声明方式上用了static关键字。即这个属性是类的,不是对象的。生命周期比茉莉花的样子较早,在类初始化时就会初始化。

我使用下面的方式,在mybatisssionfactory类中加入下面代码,并在mybatisssionfactory类上加注解@component。

首先使用@autowired注入sqlssionfactory使用@postconstruct修饰update方法,方法名任意,不能有参数。这样是为了保证这个顺序:依赖注入之后,才执行update方法。该注解的方法在整个bean初始化中的执行顺序:constructor(构造方法)->@autowired(依赖注入)->@postconstruct(注释的方法)

rulefunction类改造

还要改一个地方,初始化数据库资源的入口方法是在rulefunction类的构造函数中调用的。由于构造函数会先于依赖注入执行,需要把tfields和textinfo这两个方法提取出来,且需要在依赖注入后执行。

修改成如下,并在rulefunction类上加注解@component。

改造前的执行流程

main方法内部调用mybatisssionfactory的init方法mybatisssionfactory的init方法中new一个sqlssionfactoryrulefunction初始化时,调用自身构造方法rulefunction调用mybatisssionfactory的query方法查询数据库

改造后的执行流程

pulsarmain和mybatisssionfactory是松耦合的,mybatisssionfactory初始化时,因为通过@autowired注解注入了sqlssionfactory,所以需要初始化sqlssionfactory,sqlssionfactory初始化过程中会去使用配置文件中的数据库连接参数初始化。mybatisssionfactory初始化完成后,由于mybatisssionfactory.update方法使用了@postconstruct注解,会执行update方法,将sqlssionfactory赋值给静态属性sqlssionfactory。后续rulefunction的tfields方法执行过程中,就可以使用mybatisssionfactory的query方法查询数据库了

总结

这次改造过程,对类加载过程、对象的实例化、static关键字、spring bean的生命周期有了更深入的理解。

类加载过程,会初始化调用static修饰的属性、方法、代码块类加载过程[2]:加载、链接、初始化其中链接的过程:验证、准备、解析类初始化后,可以通过new关键字实例化一个对象,其它方式:通过反射api实例化spring bean的生命周期[3]:实例化、属性赋值、初始化、销毁

扩展

对于这个问题抽象一下:spring项目中,如果需要在一个类初始化时加载数据库资源,可以有哪些方式?

参考

[1]静态方法(工具类)中调用spring管理的bean[2]类加载过程[3]spring bean 的生命周期markdown 基于 mermaid 的时序图、流程图和甘特图

到此这篇关于记一次maven项目改造成springboot项目的过程实践的文章就介绍到这了,更多相关maven改造成springboot项目内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!好看的动画片电影

本文发布于:2023-04-06 02:18:55,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/efd2e19ea43d6f37d4474b16d60de7a4.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:记一次Maven项目改造成SpringBoot项目的过程实践.doc

本文 PDF 下载地址:记一次Maven项目改造成SpringBoot项目的过程实践.pdf

标签:初始化   方法   项目   配置文件
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图