若依 ruoyi-for-loveqq 来啦,教你怎么完全去除底层 spring 并替换为 loveqq 框架,仅替换包名即可!

本文主要是介绍若依 ruoyi-for-loveqq 来啦,教你怎么完全去除底层 spring 并替换为 loveqq 框架,仅替换包名即可!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、替换依赖

下列是现有spring相关依赖:

	<dependency><groupId>org.springframework</groupId><artifactId>spring-framework-bom</artifactId><version>${spring-framework.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.5.15</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>${druid.version}</version></dependency><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version>${shiro.version}</version></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId></dependency><dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId></dependency>

将上述依赖替换为一下依赖:

	<!-- 父模块 --><parent><groupId>com.kfyty</groupId><artifactId>loveqq-framework</artifactId><version>1.0.1</version></parent><dependency><groupId>com.kfyty</groupId><artifactId>loveqq-boot</artifactId><version>${loveqq.framework.version}</version></dependency><dependency><groupId>com.kfyty</groupId><artifactId>loveqq-boot-starter-logback</artifactId><version>${loveqq.framework.version}</version></dependency><dependency><groupId>com.kfyty</groupId><artifactId>loveqq-boot-starter-datasource</artifactId><version>${loveqq.framework.version}</version><exclusions><exclusion><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId></exclusion></exclusions></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId></dependency><dependency><groupId>com.kfyty</groupId><artifactId>loveqq-boot-starter-shiro</artifactId><version>${loveqq.framework.version}</version></dependency><dependency><groupId>com.kfyty</groupId><artifactId>loveqq-boot-starter-mybatis</artifactId><version>${loveqq.framework.version}</version></dependency><dependency><groupId>com.kfyty</groupId><artifactId>loveqq-boot-starter-tomcat</artifactId><version>${loveqq.framework.version}</version></dependency><dependency><groupId>com.kfyty</groupId><artifactId>loveqq-aop</artifactId><version>${loveqq.framework.version}</version></dependency><dependency><groupId>com.kfyty</groupId><artifactId>loveqq-boot-starter-pagehelper</artifactId><version>${loveqq.framework.version}</version></dependency><dependency><groupId>com.kfyty</groupId><artifactId>loveqq-boot-starter-thymeleaf</artifactId><version>${loveqq.framework.version}</version></dependency><dependency><groupId>com.kfyty</groupId><artifactId>loveqq-boot-starter-validator</artifactId><version>${loveqq.framework.version}</version></dependency><dependency><groupId>com.kfyty</groupId><artifactId>loveqq-boot-starter-quartz</artifactId><version>${loveqq.framework.version}</version></dependency><dependency><groupId>jakarta.annotation</groupId><artifactId>jakarta.annotation-api</artifactId></dependency><dependency><groupId>jakarta.servlet</groupId><artifactId>jakarta.servlet-api</artifactId><scope>provided</scope></dependency>

2、修改替换类

org.springframework.web.servlet.config.annotation.EnableWebMvc -> com.kfyty.loveqq.framework.web.core.autoconfig.annotation.EnableWebMvcorg.springframework.boot.autoconfigure.SpringBootApplication -> com.kfyty.loveqq.framework.core.autoconfig.annotation.BootApplicationorg.springframework.boot.SpringApplication -> com.kfyty.loveqq.framework.boot.Korg.springframework.context.annotation.ComponentScan -> com.kfyty.loveqq.framework.core.autoconfig.annotation.ComponentScanorg.springframework.stereotype.Component -> com.kfyty.loveqq.framework.core.autoconfig.annotation.Componentorg.springframework.context.annotation.Configuration -> com.kfyty.loveqq.framework.core.autoconfig.annotation.Configurationorg.springframework.context.annotation.Bean -> com.kfyty.loveqq.framework.core.autoconfig.annotation.Beanorg.springframework.context.annotation.Lazy -> com.kfyty.loveqq.framework.core.autoconfig.annotation.Lazyorg.springframework.beans.factory.FactoryBean -> com.kfyty.loveqq.framework.core.autoconfig.beans.FactoryBeanorg.springframework.context.annotation.Primary -> com.kfyty.loveqq.framework.core.autoconfig.annotation.Primaryorg.springframework.beans.factory.annotation.Value -> com.kfyty.loveqq.framework.core.autoconfig.annotation.Valueorg.springframework.boot.context.properties.ConfigurationProperties -> com.kfyty.loveqq.framework.core.autoconfig.annotation.ConfigurationPropertiesorg.springframework.cloud.context.config.annotation.RefreshScope -> com.kfyty.loveqq.framework.core.autoconfig.annotation.RefreshScopeorg.springframework.beans.factory.annotation.Autowired -> com.kfyty.loveqq.framework.core.autoconfig.annotation.Autowiredorg.springframework.scheduling.annotation.Async -> com.kfyty.loveqq.framework.core.autoconfig.annotation.Asyncorg.springframework.context.event.EventListener -> com.kfyty.loveqq.framework.core.autoconfig.annotation.EventListenerorg.springframework.stereotype.Service -> com.kfyty.loveqq.framework.core.autoconfig.annotation.Serviceorg.springframework.stereotype.Controller -> com.kfyty.loveqq.framework.web.core.annotation.Controllerorg.springframework.web.bind.annotation.RestController -> com.kfyty.loveqq.framework.web.core.annotation.RestControllerorg.springframework.web.bind.annotation.ControllerAdvice -> com.kfyty.loveqq.framework.web.core.annotation.ControllerAdviceorg.springframework.web.bind.annotation.ExceptionHandler -> com.kfyty.loveqq.framework.web.core.annotation.ExceptionHandlerorg.springframework.web.bind.annotation.RequestMapping -> com.kfyty.loveqq.framework.web.core.annotation.RequestMappingorg.springframework.web.bind.annotation.RequestBody -> com.kfyty.loveqq.framework.web.core.annotation.bind.RequestBodyorg.springframework.web.bind.annotation.PathVariable -> com.kfyty.loveqq.framework.web.core.annotation.bind.PathVariableorg.springframework.web.bind.annotation.RequestMapping -> com.kfyty.loveqq.framework.web.core.annotation.RequestMappingorg.springframework.web.servlet.HandlerInterceptor -> com.kfyty.loveqq.framework.web.mvc.servlet.interceptor.HandlerInterceptororg.springframework.web.multipart.MultipartFile -> com.kfyty.loveqq.framework.web.core.multipart.MultipartFileorg.springframework.ui.Model -> com.kfyty.loveqq.framework.web.core.request.support.Modelorg.springframework.boot.web.servlet.FilterRegistrationBean -> com.kfyty.loveqq.framework.web.mvc.servlet.filter.FilterRegistrationBeanorg.mybatis.spring.annotation.MapperScan -> com.kfyty.loveqq.framework.boot.data.orm.mybatis.autoconfig.annotation.MapperScanorg.apache.shiro.spring.web.ShiroFilterFactoryBean -> com.kfyty.loveqq.framework.boot.security.shiro.autoconfig.ShiroFilterFactoryBeanorg.mybatis.spring.SqlSessionTemplate -> com.kfyty.loveqq.framework.boot.data.orm.mybatis.autoconfig.support.ConcurrentSqlSession
上述类的修改,基本上只需要替换包名即可,仅有很少的自定义配置逻辑需要稍微修改一下即可

3、配置文件修改

spring.profiles.active=druid -> k.config.include=application-druid.yml,generator.yml
server.port=80 -> k.server.port=80
spring.datasource.** -> k.datasource.**
mybatis.typeAliasesPackage=com.ruoyi.**.domain -> mybatis.typeAliasesPackage=com.ruoyi.**.domain.**.*
mybatis.mapperLocations=classpath*:mapper/**/*Mapper.xml -> mybatis.mapperLocations=mapper/**/*Mapper.xml
mybatis.configLocation=classpath:mybatis/mybatis-config.xml -> mybatis.configLocation=mybatis/mybatis-config.xml
新增配置:template.thymeleaf.prefix=/templates/
新增配置:template.thymeleaf.suffix=.html
上述编写了主要配置变更,详细的可以查看配置属性类,也可以使用 yml 配置。另外 loveqq 框架配置文件不支持横线分隔符到驼峰的无必要转换。

4、运行 Main 方法即可。

5、loveqq 的前世今生

loveqq 前身是 kfyty-framework而 kfyty-framework 前身是 kfyty-utils而 kfyty-utils 前身是 mybatis-demo

    是的,刚开始仅仅是因为某个需求,是一张超级大宽表,要编写一个展示页面,由于字段实在太多,并且不只一个大宽表,因此就编写了一款代码生成器来辅助。并且这款代码生成器应该支持 java 编程式模板生成。但是又不想引入mybatis这种相对重量级的框架,而直接使用jdbc又比较繁琐,所以又编写了简单的可以基于注解执行SQL的简易版 mybatis,这便是 mybatis-demo。

    后来,闲来无事,又想实现简易版 springmvc,并嵌入嵌入式tomcat,以加深对 springmvc 的理解。此时对项目更名为了 kfyty-utils,作为自己的工具集。

    再后来,闲来无事,又想实现简易版 spring 及 springboot,以加深对 spring 的理解。此后便一直深耕,有时间就加入新功能。有读者可能发现,loveqq 框架的类命名和 spring 的基本上完全一致,这是就是原因。

    初期是以学习 spring 进行开发的,但是却并没有参考 spring 的实现,仅仅是把 spring 当做一个黑盒接口,根据 spring 的外在功能表现,使用自己的想法去实现功能,所以该框架,即不是模仿 spring,也不是 spring 的二开。

    比如:BeanDefinition 接口,在最初的版本实现中,并没有 bean 定义的概念,并且不支持构造方法注入,不支持普通方法注入,bean 必须有一个无参构造器。这么实现的目的是,避免复杂的循环依赖,所以此时仅有一级 bean 容器缓存。并且是扫描规则很粗暴,是扫描到带 @Component 或 @Bean 的组件,直接实例化并放入容器。后来想为 @Bean 方法增加参数,也就是为普通方法增加注入功能,但此时发现,几乎很难实现。因为我不知道此时要注入的 bean 存不存在,特别是循环依赖的场景下。因此必须引入 bean 定义的概念,先扫描 bean 定义,然后再实例化 bean。

    再比如:loveqq 框架的自动配置,不需要 AutoConfigureBefore/AutoConfigureAfter 之类的辅助注解。因为 loveqq 框架在校验有条件的 bean 定义时,不仅会校验本身的条件,还会去校验该 bean 所依赖的 bean 的条件。还引入了 bean 条件引用概念,即使某些 bean 定义还未加载,也可以找到该 bean 所依赖的 bean 的条件。因此无需关心 bean 加载顺序的问题。下面就是一个很好的例子:

@BootApplication
public class ConditionTest {private boolean isOverride;@Autowired(required = false)private List<Inter> cons;@Beanpublic BB bbOverride() {this.isOverride = true;return new BB();}@EventListenerpublic void onComplete(ContextRefreshedEvent event) {Assert.isTrue(this.isOverride);Assert.isTrue(this.cons.size() == 5);}public static void main(String[] args) {SpringApplication.run(ConditionTest.class, args);}
}interface Inter {}@Component
@ConditionalOnBean({CC.class, BB.class})
@ConditionalOnClass(name = "com.kfyty.condition.ConditionTest")
class AA implements Inter {}@Component
@ConditionalOnMissingBean(BB.class)
class BB implements Inter {}@Component
@ConditionalOnBean(BB.class)
class CC implements Inter {@Bean@ConditionalOnBean(AA.class)public EE ee() {return new EE();}
}class DD implements Inter {}@Component
@ConditionalOnMissingBean(DD.class)
class DDF implements FactoryBean<DD> {@Overridepublic Class<?> getObjectType() {return DD.class;}@Overridepublic DD getObject() {return new DD();}
}class EE implements Inter {}

上述代码,首先 BB 是无条件直接定义的,所以 BB 一定存在;
而 CC 仅依赖 BB 存在,所以 CC 一定存在;
而 AA 仅依赖 BB、CC 的存在,以及主类的存在,因此 AA 一定存在;
而 EE 仅依赖 AA,因此 EE 一定存在;
而我们没有直接定义 DD,因此 DDF 一定存在,而 DDF 属于 FactoryBean,它生产了 DD,所以 DD 一定存在;
所以 AA、BB、CC、DD、EE 的条件都成立,cons.size() 应该是 5。
而上述代码在 spring 下无法通过测试,但是在 loveqq-framework 中是可以测试通过的。

    后来不断完善,准备正式发布,就更名为了 kfyty-framework,并发布了 kfyty-framework 1.0.0 版本。

    再后来,有读者建议取个正式一点的名字,因为正式更名为 loveqq-framework,并发布了 1.0.1 版本。

感谢阅读,感兴趣的可在 github/gitee 搜索 loveqq-framework。其中 ruoyi-for-loveqq,仅在 gitee 上。

这篇关于若依 ruoyi-for-loveqq 来啦,教你怎么完全去除底层 spring 并替换为 loveqq 框架,仅替换包名即可!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1084480

相关文章

Java五子棋之坐标校正

上篇针对了Java项目中的解构思维,在这篇内容中我们不妨从整体项目中拆解拿出一个非常重要的五子棋逻辑实现:坐标校正,我们如何使漫无目的鼠标点击变得有序化和可控化呢? 目录 一、从鼠标监听到获取坐标 1.MouseListener和MouseAdapter 2.mousePressed方法 二、坐标校正的具体实现方法 1.关于fillOval方法 2.坐标获取 3.坐标转换 4.坐

[职场] 护理专业简历怎么写 #经验分享#微信

护理专业简历怎么写   很多想成为一名护理方面的从业者,但是又不知道应该怎么制作一份简历,现在这里分享了一份护理方面的简历模板供大家参考。   蓝山山   年龄:24   号码:12345678910   地址:上海市 邮箱:jianli@jianli.com   教育背景   时间:2011-09到2015-06   学校:蓝山大学   专业:护理学   学历:本科

Spring Cloud:构建分布式系统的利器

引言 在当今的云计算和微服务架构时代,构建高效、可靠的分布式系统成为软件开发的重要任务。Spring Cloud 提供了一套完整的解决方案,帮助开发者快速构建分布式系统中的一些常见模式(例如配置管理、服务发现、断路器等)。本文将探讨 Spring Cloud 的定义、核心组件、应用场景以及未来的发展趋势。 什么是 Spring Cloud Spring Cloud 是一个基于 Spring

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

java8的新特性之一(Java Lambda表达式)

1:Java8的新特性 Lambda 表达式: 允许以更简洁的方式表示匿名函数(或称为闭包)。可以将Lambda表达式作为参数传递给方法或赋值给函数式接口类型的变量。 Stream API: 提供了一种处理集合数据的流式处理方式,支持函数式编程风格。 允许以声明性方式处理数据集合(如List、Set等)。提供了一系列操作,如map、filter、reduce等,以支持复杂的查询和转

Java面试八股之怎么通过Java程序判断JVM是32位还是64位

怎么通过Java程序判断JVM是32位还是64位 可以通过Java程序内部检查系统属性来判断当前运行的JVM是32位还是64位。以下是一个简单的方法: public class JvmBitCheck {public static void main(String[] args) {String arch = System.getProperty("os.arch");String dataM

电脑不小心删除的文件怎么恢复?4个必备恢复方法!

“刚刚在对电脑里的某些垃圾文件进行清理时,我一不小心误删了比较重要的数据。这些误删的数据还有机会恢复吗?希望大家帮帮我,非常感谢!” 在这个数字化飞速发展的时代,电脑早已成为我们日常生活和工作中不可或缺的一部分。然而,就像生活中的小插曲一样,有时我们可能会在不经意间犯下一些小错误,比如不小心删除了重要的文件。 当那份文件消失在眼前,仿佛被时间吞噬,我们不禁会心生焦虑。但别担心,就像每个问题

详细分析Springmvc中的@ModelAttribute基本知识(附Demo)

目录 前言1. 注解用法1.1 方法参数1.2 方法1.3 类 2. 注解场景2.1 表单参数2.2 AJAX请求2.3 文件上传 3. 实战4. 总结 前言 将请求参数绑定到模型对象上,或者在请求处理之前添加模型属性 可以在方法参数、方法或者类上使用 一般适用这几种场景: 表单处理:通过 @ModelAttribute 将表单数据绑定到模型对象上预处理逻辑:在请求处理之前

eclipse运行springboot项目,找不到主类

解决办法尝试了很多种,下载sts压缩包行不通。最后解决办法如图: help--->Eclipse Marketplace--->Popular--->找到Spring Tools 3---->Installed。

JAVA读取MongoDB中的二进制图片并显示在页面上

1:Jsp页面: <td><img src="${ctx}/mongoImg/show"></td> 2:xml配置: <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001