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

本文介绍了Kfyty-framework,一个扩展了Spring基础功能的框架,重点在于条件注解的使用和对Spring机制的深入理解。框架集成了多个组件并提供更强大的功能,如懒加载和AOP支持。
摘要由CSDN通过智能技术生成

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

该框架目前相比 spring,除了基础的 ioc/aop 支持外,实现了比 spring 更强大的条件推断。比如下面的条件 bean 定义:

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 kfyty725@hotmail.com
 */
@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,可远程调用,可使用服务发现

下面是简单的示例:

package com.kfyty.demo;

import com.kfyty.boot.K;
import com.kfyty.boot.validator.annotation.Condition;
import com.kfyty.core.autoconfig.annotation.Async;
import com.kfyty.core.autoconfig.annotation.BootApplication;
import com.kfyty.core.autoconfig.annotation.EventListener;
import com.kfyty.core.event.ContextRefreshedEvent;
import com.kfyty.web.mvc.annotation.GetMapping;
import com.kfyty.web.mvc.autoconfig.annotation.EnableWebMvc;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@EnableWebMvc
@BootApplication
public class Main {

    public static void main(String[] args) {
        K.run(Main.class, args);
    }

    @GetMapping
    public User hello(@Valid User user) {
        return user;
    }

    @Async
    @EventListener
    public void onStarted(ContextRefreshedEvent event) {
        log.info("started succeed !");
    }

    @Data
    public static class User {
        @Condition(when = "type == 1", then = "photo != null", message = "type=1时,图片不能为空")
        private Integer type;

        private String photo;
    }
}
  • 24
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值