func-spring-boot-starter 匿名函数托管
func-spring-boot-starter 匿名函数托管
GitHub项目路径:
https://github.com/yiurhub/func-spring-boot-starter
Gitee项目路径:
https://gitee.com/yiur/func-spring-boot-starter
使用注意事项
推荐版本:
- 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")
松散类型托管需要注意的事项:
- 代理方法返回值与接口不一样,接口返回值必须得是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 匿名函数托管的更多相关文章
- 匿名函数托管 func-spring-boot-starter
匿名函数托管 func-spring-boot-starter 项目地址 func-spring-boot-starter开源项目地址: https://gitee.com/yiur/func-spr ...
- Spring Boot (一): Spring Boot starter自定义
前些日子在公司接触了spring boot和spring cloud,有感于其大大简化了spring的配置过程,十分方便使用者快速构建项目,而且拥有丰富的starter供开发者使用.但是由于其自动化配 ...
- Spring Boot Starter 介绍
http://www.baeldung.com/spring-boot-starters 作者:baeldung 译者:http://oopsguy.com 1.概述 依赖管理是任何复杂项目的关键部分 ...
- spring -boot s-tarter 详解
Starter POMs是可以包含到应用中的一个方便的依赖关系描述符集合.你可以获取所有Spring及相关技术的一站式服务,而不需要翻阅示例代码,拷贝粘贴大量的依赖描述符.例如,如果你想使用Sprin ...
- SpringBoot 之Spring Boot Starter依赖包及作用
Spring Boot 之Spring Boot Starter依赖包及作用 spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置.日志和YAML. spri ...
- Spring boot starter pom的依赖关系说明
Spring Boot 通过starter依赖为项目的依赖管理提供帮助.starter依赖起始就是特殊的maven依赖,利用了传递依赖解析,把常用库聚合在一起,组成了几个为特定功能而定制的依赖. sp ...
- Spring Boot Starter列表
转自:http://blog.sina.com.cn/s/blog_798f713f0102wiy5.html Spring Boot Starter 基本的一共有43种,具体如下: 1)spring ...
- 创建自己的Spring Boot Starter
抽取通用模块作为项目的一个spring boot starter.可参照mybatis的写法. IDEA创建Empty Project并添加如下2个module,一个基本maven模块,另一个引入sp ...
- 自己写spring boot starter
自己写spring boot starter 学习了:<spring boot实战>汪云飞著 6.5.4节 pom.xml <project xmlns="http://m ...
随机推荐
- Windows三种文件系统:NTFS、FAT32、FAT16的区别
什么是文件系统? 文件系统是操作系统用于明确磁盘或分区上的文件的方法和数据结构:即在磁盘上组织文件的方法.也指用于存储文件的磁盘或分区,或文件系统种类. 举个通俗的比喻,一块硬盘就像一个块空地,文件就 ...
- 【C#基础概念】程序集与托管模块的概念
本文是为了学习程序集而整理的网上资料,主要包括两个部分,概念和使用,前部分讲怎样理解程序集,后部分讲述怎样使用的细节. 程序集与托管模块的概念 "程序集与托管代码块"(摘自Hima ...
- 原生数据类型 nint,nuint,nfloat
原生数据类型根据操作系统32位 64位的不同,用这个关键定义的数据大小也不一样. 比如 nint 在 Xamarin.iOS 中,是 native int(原生整数)的缩写.当设备是 Apple 发布 ...
- Redis学习笔记(详细)
目录 概述 Redis安装启动 常用五大数据类型 Redis键(key) Redis字符串(String) Redis列表(List) Redis集合(Set) Redis哈希(Hash) Redis ...
- Qt:QWebChannel
0.说明 QWebChannel的作用是将QObject展示给的HTML客户. QWebChannel是连接C++应用和HTML/JS应用的桥梁.通过把一个QObject传入QWebChannel并在 ...
- 2020.11.2 异步IO 协程
异步IO 同步IO在一个线程中,CPU执行代码的速度极快,然而,一旦遇到IO操作,如读写文件.发送网络数据时,就需要等待IO操作完成,才能继续进行下一步操作. 在IO操作的过程中,当前线程被挂起,而其 ...
- MySql绿色版的安装
MySql绿色版的安装 1.下载 2.配置环境变量,执行命令 mysqld --initialize-insecure --user=mysql 会创建出data文件夹 3.创建my.ini文件 [c ...
- 前端vue下载文件时blob返回流中怎么获取文件名
我很久之前写了一篇前端vue利用blob对象下载文件,有些人私信我,如果后端返回流失败,给出的json对象该怎么获得?前端获取的流怎么能获取原文件名?其实在那篇文章之后,我就已经针对这两个问题进行了优 ...
- C#控制打印机打印
一.引用BarcodeStandard.dll #region BarcodeStandard.dll /* * * 使用说明 需要通过NuGet进行安装BarcodeLib.dll,必不可少 */ ...
- PHP动态修改配置文件
文件结构: index.php 主页 config 配置文件 doUpdate.php 修改功能页 index.php <html> <head> <title>修 ...