func-spring-boot-starter 匿名函数托管

GitHub项目路径:

https://github.com/yiurhub/func-spring-boot-starter

Gitee项目路径:

https://gitee.com/yiur/func-spring-boot-starter

使用注意事项

推荐版本:

  1. spring-boot-starter 2.6.x

设计原理

匿名函数特性

匿名函数链接配置

Yaml

func-link:
# 默认代理模式
singleton: true
# 默认开启lambda模式
lambda: true
# 默认的callback回调函数类
call-back: org.func.spring.boot.component.callback.SimpleFuncCallback
# logger 配置
logger:
# 默认false 不输出日志
enable-log: false
# 默认输出日志信息 ${取当前匿名函数的公开信息}
message: "call method --> ${methodName}(${parameterSource})"
# 日志执行日志格式化
date-format: "yyyy-MM-dd HH:mm:ss"
# 输出日志的文件名
file-name: "simple"

JavaConfig

添加类注解@EnableFuncLambda

需要注入FuncLinkFactory工厂类,生产默认FuncLink链接类

添加链接的方法为setObject(key, Object) 链式编程 泛型约束 Lambda

​ key: {Spring Bean Name}{功能链接 | 插件}

​ object: ${功能链接类| 插件类}

FuncLink推荐Lambda操作

详细内容请看项目:

https://gitee.com/yiur/func-spring-boot-starter/tree/main/func-web-simple
@Configuration
@EnableFuncLambda("com.simple.web.lambda")
public class FuncLinkConfig { @Autowired
public FuncLinkFactory funcLinkFactory; @Bean
public FuncLink funcLink() {
return funcLinkFactory.build()
.<FuncLogger>setObject("logger:log", (set, log) -> "logger => ${methodName}\r\n");
} }

严格类型托管

开发推荐严格类型托管,有代码提示,开发效率更高,在Web项目中,可以托管整个Servcie

配合Mybaits,Redis等框架一起使用

1、定义接口

用于SpringBoot自动注入funcLink代理的HttpLink类

public interface HttpLink {

    Object link();

}

2、代理类代理接口方法

@FuncBean(link = "funcLink Bean Name")

添加类注解@FuncBean声明这是一个匿名函数代理类

添加方法注解@FuncLambda声明这是一个代理方法

如果有参数请加上参数注解@FuncParameter("参数名")

@Component
@FuncBean
public class FuncLinkHosting implements HttpLink { @Override
@FuncLambda(classFile = HttpLink.class)
public Map<String, String> link() {
Map<String, String> map = new HashMap<>(10);
map.put("GitHub", "https://github.com/yiurhub");
map.put("Gitee", "https://gitee.com/yiur");
map.put("博客", "https://www.cnblogs.com/yiur-bgy");
return map;
} }

松散类型托管

开发使用不推荐,后续2.x估计废用,可读性不高

1、定义接口

添加类注解@Component,用于SpringBoot自动注入funcLink代理的HttpLink类,SpringBoot插件提升

@Component
public interface HttpLink { Object link(); }

2、代理类代理接口方法

@FuncBean(link = "funcLink Bean Name")

松散类型托管需要注意的事项:

  1. 代理方法返回值与接口不一样,接口返回值必须得是Object

添加类注解@FuncBean声明这是一个匿名函数代理类

添加方法注解@FuncLambda声明这是一个代理方法

如果有参数请加上参数注解@FuncParameter("参数名")

@FuncBean
public class FuncLinkHosting { @FuncLambda(classFile = HttpLink.class)
public Map<String, String> link() {
Map<String, String> map = new HashMap<>(10);
map.put("GitHub", "https://github.com/yiurhub");
map.put("Gitee", "https://gitee.com/yiur");
map.put("博客", "https://www.cnblogs.com/yiur-bgy");
return map;
} }

@FuncLogger

添加方法注解@FuncLogger开启方法执行完后的输出日志,优先级比配置文件高

@FuncLogger参数

name: 生成的日志文件名,默认为func-link

​ suffix: 生成的日志文件后缀名,默认为log

​ path: 生成的日志文件存放绝对路径路径,默认当前项目下的log文件夹下

@FuncBean
public class FuncLinkHosting implements HttpLink { @Override
@FuncLogger
@FuncLambda(classFile = HttpLink.class)
public Map<String, String> link() {
Map<String, String> map = new HashMap<>(10);
map.put("GitHub", "https://github.com/yiurhub");
map.put("Gitee", "https://gitee.com/yiur");
map.put("博客", "https://www.cnblogs.com/yiur-bgy");
return map;
} }

FuncLink 返回message

应用

Logger 日志功能链接,根据执行方法绑定的Bean或者ref,执行此功能

在绑定的方法中执行完后,则会输出日志,获取执行的方法信息

链接

FuncLogger

​ 功能链接为: "${Bean Name}:log"

代码

@Configuration
@EnableFuncLambda("com.simple.web.lambda")
public class FuncLinkConfig { @Autowired
public FuncLinkFactory funcLinkFactory; @Bean
public FuncLink funcLink() {
return funcLinkFactory.build()
.<FuncLogger>setObject("httpLink:log", (set, log) -> "logger => ${methodName}\r\n");
} }

@FuncCallback 注解实现

添加方法注解@FuncCallback绑定方法执行后的回调函数

成功执行回调: then(T result)

失败执行回调: error(Throwable e)

public class DefaultCallback implements FuncCallback {

    @Override
public Object then(Object data) { return data; } @Override
public Object error(Throwable error) {
return error.getMessage();
} }
@FuncBean
public class FuncLinkHosting implements HttpLink { @Override
@FuncCallback(DefaultCallback.class)
@FuncLambda(classFile = HttpLink.class)
public Map<String, String> link() {
Map<String, String> map = new HashMap<>(10);
map.put("GitHub", "https://github.com/yiurhub");
map.put("Gitee", "https://gitee.com/yiur");
map.put("博客", "https://www.cnblogs.com/yiur-bgy");
return map;
} }

FuncLink Callback 实现

应用

Callback 方法执行完回调功能链接,根据执行方法绑定的Bean或者ref,执行此功能

在Web项目Service层中返回方法执行的结果,能做到服务熔断操作

链接

FuncCallback<T, R>约束参数值和返回值,执行优先级: 1

​ 功能链接为: "${Bean Name}:callback"

FuncCallbackThen<T, R>约束参数值和返回值,执行优先级: 2

​ 功能链接为: "${Bean Name}:callback-then"

FuncCallbackError<R>约束返回值,执行优先级: 2

​ 功能链接为: "${Bean Name}:callback-error"

代码

@Configuration
@EnableFuncLambda("com.simple.web.lambda")
public class FuncLinkConfig { @Autowired
public FuncLinkFactory funcLinkFactory; @Bean("simple")
public FuncLink funcLink() {
return funcLinkFactory.build()
// httpLink
.<FuncCallback<Map<String, String>, Object>>setObject("httpLink:callback", new FuncCallback<Map<String, String>, Object>() {
@Override
public Object then(Map<String, String> result) {
return result;
} @Override
public Object error(Throwable throwable) {
return throwable;
}
})
.<FuncCallbackThen<Map<String, String>, Object>>setObject("httpLink:callback-then", result -> result)
.<FuncCallbackError<Object>>setObject("httpLink:callback-error", throwable -> throwable);
} }

FuncLink Life 实现

应用

Life 方法执行前后回调功能链接,根据执行方法绑定的Bean或者ref,执行此功能

方法执行前会先执行start方法,用来检查参数

方法执行后会执行end方法,用来检查返回值

链接

FuncLife<T, R>约束参数值和返回值,执行优先级: 1

​ 功能链接为: "${Bean Name}:life"

FuncLifeStart约束参数值和返回值,执行优先级: 2

​ 功能链接为: "${Bean Name}:life-start"

FuncLifeEnd<T, R>约束返回值,执行优先级: 2

​ 功能链接为: "${Bean Name}:life-end"

代码

@Configuration
@EnableFuncLambda("com.simple.web.lambda")
public class FuncLinkConfig { @Autowired
public FuncLinkFactory funcLinkFactory; @Bean("simple")
public FuncLink funcLink() {
return funcLinkFactory.build()
// httpLink
.<FuncLife<Object, Object>>setObject("httpLink:life", new FuncLife<Object, Object>() {
@Override
public Map<String, Object> start(Map<String, Object> args) {
return args;
} @Override
public Object end(Object result) {
return result;
}
})
.<FuncLifeStart>setObject("httpLink:life-start", args -> args)
.<FuncLifeEnd<Object, Object>>setObject("httpLink:life-end", result -> result);
} }

1.1.3.RELEASE 更新

func-spring-boot-starter-1.1.2.RELEASE 依赖

<!--func-->
<dependency>
<groupId>io.github.yiurhub</groupId>
<artifactId>func-spring-boot-starter</artifactId>
<version>1.1.3.RELEASE</version>
</dependency>

添加匿名函数链接自定义实现功能

AbstractFuncLifePlugin

public class SimpleLifePlugin extends AbstractFuncLifePlugin {

    public SimpleLifePlugin() {
} public SimpleLifePlugin(String beanName, String[] refs, FuncLink funcLink, FuncCallbackPlugin funcCallbackPlugin) {
super(beanName, refs, funcLink, funcCallbackPlugin);
} }

AbstractFuncCallbackPlugin

public class SimpleCallbackPlugin extends AbstractFuncCallbackPlugin {

    public SimpleCallbackPlugin() {
} public SimpleCallbackPlugin(String beanName, String[] refs, FuncLink funcLink, FuncProperties funcProperties, FuncLoggerPlugin funcLoggerPlugin) {
super(beanName, refs, funcLink, funcProperties, funcLoggerPlugin);
} }

AbstractFuncLoggerPlugin

public class SimpleLoggerPlugin extends AbstractFuncLoggerPlugin {

    public SimpleLoggerPlugin() {
} public SimpleLoggerPlugin(String beanName, String[] refs, FuncLink funcLink, FuncProperties funcProperties) {
super(beanName, refs, funcLink, funcProperties);
} }

FuncLink 使用

@Configuration
@EnableFuncLambda("com.simple.web.lambda")
public class FuncLinkConfig { @Autowired
public FuncLinkFactory funcLinkFactory; @Bean("simple")
public FuncLink funcLink() {
return funcLinkFactory.build()
// httpLink
.setObject("httpLink:FuncLifePlugin", SimpleLifePlugin.class)
.setObject("httpLink:FuncCallbackPlugin", SimpleCallbackPlugin.class)
.setObject("httpLink:FuncLoggerPlugin", SimpleLoggerPlugin.class)
} }

API更改

注解更改

@FuncConfiguration 改为 @FuncBean

@EnableLog 改为 @FuncLogger

CallbackClass 改为 @FuncCallback

func-spring-boot-starter 匿名函数托管的更多相关文章

  1. 匿名函数托管 func-spring-boot-starter

    匿名函数托管 func-spring-boot-starter 项目地址 func-spring-boot-starter开源项目地址: https://gitee.com/yiur/func-spr ...

  2. Spring Boot (一): Spring Boot starter自定义

    前些日子在公司接触了spring boot和spring cloud,有感于其大大简化了spring的配置过程,十分方便使用者快速构建项目,而且拥有丰富的starter供开发者使用.但是由于其自动化配 ...

  3. Spring Boot Starter 介绍

    http://www.baeldung.com/spring-boot-starters 作者:baeldung 译者:http://oopsguy.com 1.概述 依赖管理是任何复杂项目的关键部分 ...

  4. spring -boot s-tarter 详解

    Starter POMs是可以包含到应用中的一个方便的依赖关系描述符集合.你可以获取所有Spring及相关技术的一站式服务,而不需要翻阅示例代码,拷贝粘贴大量的依赖描述符.例如,如果你想使用Sprin ...

  5. SpringBoot 之Spring Boot Starter依赖包及作用

    Spring Boot 之Spring Boot Starter依赖包及作用 spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置.日志和YAML. spri ...

  6. Spring boot starter pom的依赖关系说明

    Spring Boot 通过starter依赖为项目的依赖管理提供帮助.starter依赖起始就是特殊的maven依赖,利用了传递依赖解析,把常用库聚合在一起,组成了几个为特定功能而定制的依赖. sp ...

  7. Spring Boot Starter列表

    转自:http://blog.sina.com.cn/s/blog_798f713f0102wiy5.html Spring Boot Starter 基本的一共有43种,具体如下: 1)spring ...

  8. 创建自己的Spring Boot Starter

    抽取通用模块作为项目的一个spring boot starter.可参照mybatis的写法. IDEA创建Empty Project并添加如下2个module,一个基本maven模块,另一个引入sp ...

  9. 自己写spring boot starter

    自己写spring boot starter 学习了:<spring boot实战>汪云飞著 6.5.4节 pom.xml <project xmlns="http://m ...

随机推荐

  1. 【windows 访问控制】四、访问控制项ACE

    访问控制项 具体内容 : https://docs.microsoft.com/zh-cn/windows-hardware/drivers/ifs/access-control-entry   访问 ...

  2. Oracle数据库常用命令整理

    转至:https://blog.csdn.net/creativemobile/article/details/8982164 1监听 (1)启动监听 lsnrctl start (2)停止监听  l ...

  3. UML类图的补充及软件设计原则

    UML类图的补充及软件设计原则 UML 从目标系统的不同角度出发,定义了用例图.类图.对象图.状态图.活动图.时序图.协作图.构件图.部署图等 9 种图. 1.uml补充 统一建模语言(Unified ...

  4. Vue中组件的递归

    先来说下需求,就是一个表单,会有树形结构一样,会有子表单,表单显示什么内容是后台通过接口数据来确定的:这个时候就和树形结构一样,肯定会有子组件的递归:这次是自己第一次写递归,遇到了三个问题记录下: 1 ...

  5. 跨越DDD从理论到工程落地的鸿沟

    摘要:本文从DDD的核心概念讲起,重点放在如何把理论落地成代码,期望给那些正在探索DDD的同学一些指引和启发. 本文分享自华为云社区<跨越DDD从理论到工程落地的鸿沟>,作者:敏捷小智. ...

  6. Python语法3

    目录 模块 Python程序架构 第三方工具包: 创建packet包 模块导入方式 异常处理 六种典型异常 异常处理 自定义异常 模块 Python程序架构 Python源代码文件:*.py 一个py ...

  7. ABP Framework 5.2 RC 发布及新增功能介绍

    ABP Framework 5.2 RC 新增功能 目录 ABP Framework 5.2 RC 新增功能 单层解决方案模板 EF Core 数据库迁移 UI 和 数据库 选项 API 版本控制 源 ...

  8. linux作业--第二周

    1.显示/etc目录下,以非字母开头,后面跟了一个字母以及其它任意长度任意字符的文件或目录 ls /etc/ | grep ^[^[:alpha:]][[:alpha:]].* 2.复制/etc目录下 ...

  9. web -- ssrf

    web学习之SSRF 最开始玩ctf接触的就是web但是随着开始逐渐专注于pwn,在加之web的知识体系本来就繁杂,所以准备写一期关于web大体的知识 day1 SSRF SSRF(Server-Si ...

  10. think php 验证码

    1.下载 composer require topthink/think-captcha 1.* // composer 下载 //过程 D:\PHP\phpstudy_pro\WWW\1906A\p ...