​​​​​​​轻量 ioc/aop 框架 kfyty-framework,比 spring 更强大的条件推断


 kfyty-framework 轻量级 ioc/aop 框架,比 spring 更强大的条件注解推断,打包后支持 jar index 启动,启动速度更快

注解式 ioc/aop、自动装配、异步事件、动态代理、注解式 mvc(支持 Restful)、嵌入式 tomcat、
注解式 jdbc 框架、javafx mvvm 框架,并基于此开发了一套支持 java/enjoy/freemarker/jsp 模板的代码生成器。

kfyty-core

项目核心,包含一些通用工具类、jar index 启动引导、泛型推断工具、jdbc 访问工具、bean 封装工具、包读取工具、json 转换工具以及自动配置接口、自动配置注解等

kfyty-database

数据库访问工具,基于代理实现了接口式 jdbc 访问,支持注解编写 SQL 或者基于模板引擎(如:enjoy/freemarker) 的动态 SQL; 内置代码生成器和默认生成模板,支持 java 编程模板、enjoy/freemarker 模板以及 jsp 模板(需要 k-jte 支持),或者自定义模板引擎。

kfyty-mvc

注解式 mvc,支持嵌入式 tomcat、复杂参数自动转换绑定、 restful/ant 风格路径匹配、全局异常处理、请求拦截器等。

kfyty-aop

AOP 模块,支持 ant 路径匹配、支持注解类型匹配、集成 AspectJ,可以单独使用,也可以集成到 kfyty-boot 自动配置。

kfyty-sdk

用于快速封装 sdk,只需编写请求及响应模型,支持拦截器,易于拓展,支持命令式、响应式风格

kfyty-javafx

javafx mvvm 框架,实现了视图和数据模型的双向绑定。代码中只需操作数据即可反应到视图上,视图上编辑数据即可反应到模型里。详见 javafx 模块 README.md.

kfyty-boot

注解式 ioc、自动装配、作用域代理(单例/原型/刷新)、懒加载代理、配置文件属性自动绑定(支持嵌套的复杂类型绑定)、条件注解、jsr 条件注解校验器、异步事件、动态代理、spi、自定义 jar index 类加载器 等。

该框架刚开始仅仅是想自己造个轮子,从而加深对 spring 的理解。因此实现方式上,在命名上和 spring 注解保持一致,具体实现上先依据自己的思路实现,然后和 spring 的实现做对比,进而优化加深理解。
查看该框架的历史,你可以发现:
为什么一定必须要先生成 BeanDefinition,然后才能去生成 bean,为什么不能扫描到注解,直接就生成 bean
为什么 FactoryBean 定义的 bean,而 FactoryBean 本身的 bean name 一定要加 & 前缀
为什么一定要多级缓存才能实现 ioc,为什么一级缓存就是实现不了
为什么一定要有 Lazy 注解实现懒加载注入
等等

条件推断示例:

package com.kfyty.condition;

import cn.hutool.core.lang.Assert;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * 描述: 条件注解测试
 *
 * @author kfyty725
 * @date 2022/4/23 11:06
 * @email [email protected]
 */
@SpringBootApplication
public class ConditionTest {
private boolean isOverride;

@Autowired(required = false)
private List<Inter> cons;

@Bean
public BB bbOverride() {
this.isOverride = true;
return new BB();
}

@EventListener
public 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> {

@Override
public Class<?> getObjectType() {
return DD.class;
}

@Override
public 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 下无法通过测试,但是在 kfyty-framework 中是可以测试通过的。

目前该框架还已经集成了下述框架:
kfyty-aop:aspect-j 集成
kfyty-javafx:一个实现了 javafx 模型与数据双向绑定的 mvvm 框架
kfyty-database:一个半 orm 框架,支持集成任意第三方模板引擎编写 SQL
kfyty-boot-starter-spring-tx:集成 spring 事务管理器
kfyty-mvc/kfyty-boot-starter-tomcat:mvc 模块/嵌入式 tomcat 服务器
kfyty-boot-starter-datasource:数据源自动配置
kfyty-boot-starter-validator:jsr 校验器自动配置
kfyty-boot-starter-uid-generator:集成百度 uid 生成器
kfyty-boot-starter-quartz:集成 quartz
kfyty-boot-starter-xxl-job:集成 xxl-job
kfyty-boot-starter-redisson:集成 redisson
kfyty-boot-starter-config-nacos:集成 nacos 配置中心,支持自动刷新配置
kfyty-boot-starter-discovery-nacos:集成 nacos 服务发现中心
kfyty-boot-starter-feign:集成 feign,可远程调用,可使用服务发现


相關推薦

2024-07-26

本次更新: 优化: loveqq-mvc,控制器全局异常切面实现从代理改为异常处理器,减少代理调用 优化:loveqq-cache,新增响应式缓存支持,默认提供 ConcurrentHashMap 实现 优化:loveqq-cache-redis,整合 redisson 响应式缓存支持

2024-06-18

loveqq-framework 轻量级 ioc/aop 框架,比 spring 更强大的条件注解推断,打包后支持 jar index 启动。 本次更新: 正式更名为:loveqq-famework 新增:loveqq-boot-starter-mybatis 新增:loveqq-boot-starter-pagehelper 新增:loveqq-boot-starter-shiro

2024-07-12

配置 loveqq-framework 的前世今生 loveqq-framework 前身是 kfyty-framework 而 kfyty-framework 前身是 kfyty-utils 而 kfyty-utils 前身是 mybatis-demo &ensp;&ensp;&ensp;&ensp;是的,刚开始仅仅是因为某个需求,是一张超级大宽表,

2023-09-20

ng 生态这个巨人存在。但,真的有很多人是期待的:一个轻量的,更现代感的,最好还是国产的。 刚开始的确会很难;刚开始可能不如人家的完善;刚开始会有很多人质疑和漫骂。再难能有芯片难???不是说非要替换代别人

2022-09-06

项目介绍 MiniDao 是一款轻量级 JAVA 持久层框架,基于 SpringJdbc + freemarker 实现,具备 Mybatis 一样的 SQL 分离和逻辑标签能力。Minidao 产生的初衷是为了解决 Hibernate 项目,在复杂 SQL 具备 Mybatis 一样的灵活能力,同时支持事务同

2024-08-27

重大改动 增加 ruoyi-common-sse 模块 支持SSE推送 比ws更轻量更稳定的推送 增加 springboot snailjob 等 actuator 账号密码认证 杜绝内外网信息泄漏问题 增加 重构代码生成器 集成anyline开源框架 支持400+种数据库适配 依赖升

2023-06-14

介绍 dbVisitor 是一个轻量小巧的数据库开发工具,支持 ORM、数据生成工具 / 数据库性能测试。具有对象映射以及丰富的类型处理。提供动态 SQL、存储过程、 内置分页方言 20+、 支持嵌套事务、多数据源、条件构造器、INSERT 策略

2023-03-09

1、smart-flow 简介 smart-flow 是一个轻量、灵活的业务流程编排框架,支持业务流程中常见的条件分支控制、子流程、业务组件异步和降级等功能。同时smart-flow也是一款具备可观测性的流程编排框架,流程结构拓扑、执行路径跟踪

2024-06-22

应速度,是应用开发中必不可少的能力。仓颉语言实现了轻量化用户态线程和并发对象库,让高效并发变得轻松。 仓颉语言采用用户态线程模型,每个仓颉线程都是极其轻量级的执行实体,拥有独立的执行上下文但共享内存。

2024-08-27

重大改动 增加 ruoyi-common-sse 模块 支持SSE推送 比ws更轻量更稳定的推送 增加 springboot snailjob 等 actuator 账号密码认证 杜绝内外网信息泄漏问题 增加 重构代码生成器 集成anyline开源框架 支持400+种数据库适配 依赖升

2023-12-20

页以及超强的 sql 优化功能; 5:稳定且性能极优; 6:轻量级封装 mybatis,几乎没有侵入; 7:api 丰富,支持数据库函数、多表、乐观锁、多租户、逻辑删除、默认值(可动态值) 等众多功能; 8:零学习成本,和写 sql 一样

2024-03-19

页以及超强的 sql 优化功能; 6:稳定且性能极优; 7:轻量级封装 mybatis,几乎没有侵入; 8:api 丰富,支持数据库函数、多表、乐观锁、多租户、逻辑删除、默认值(可动态值) 等众多功能; 9:零学习成本,和写 sql 一样

2022-08-15

Erupt  通用后台管理框架 Erupt 是一个低代码 全栈类 框架,它使用 Java 注解 动态构建页面,及增、删、改、查、权限控制等功能。 零前端代码、零 CURD、自动建表,仅需 一个类文件 + 简洁的注解配

2024-08-02

不想被庞大的前端框架所束缚的开发者,HTMX 提供了一种轻量、灵活的解决方案。你可以在现有项目中逐步引入 HTMX,而无需全面推倒重来。 具体来说: 从繁琐的 JavaScript 到简洁的 HTML:代码对比 还记得那些让人头疼的 Ja