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. Java、Python语法区别,不断更新

    基本语句.文件方面 Java中的字符是单引号,字符串是双引号:Python则是单双都可以 Java语句结束有分号;,Python没有(写分号也正确) Java中程序执行需要有main函数,Python ...

  2. SQL Server用SPLIT函数分割字符串

      declare @str varchar(100),@sql varchar(1000)set @str='1,2,3,4,5,6,7,8,9,10'set @sql='select Value= ...

  3. 安装xpath helper方便进行爬虫

    安装xpath helper方便进行爬虫 因为我使用的是edge浏览器,扩展商店搜索不到xpath-helper,但是我不甘心,取下载源扩展直接放在edge中试试 下载XPath helper的源码 ...

  4. 流程控制、if、elif、else,whilie、break、continue的使用

    今日内容 流程控制理论 if判断 while循环 流程控制概念 流程控制就是控制事物的执行流程 执行流程的分类 顺序结构 从上往下依次执行,代码运行流程图如下 分支结构 根据某些条件判断做出不同的运行 ...

  5. iframe于iframe页面之间的函数相互调用

    因为iframe页面于包括父页面在内的其他页面通讯有跨域问题,所以只有在服务器环境下或者火狐浏览器下才能测试. 在iframe页面调用父页面的函数采用parent,例子:在父页面有一个say()函数, ...

  6. Nginx高并发实现原理以及常用的优化手段

    Nginx 是如何实现高并发的? 异步,非阻塞,使用了epoll 和大量的底层代码优化. 如果一个server采用一个进程负责一个request的方式,那么进程数就是并发数.正常情况下,会有很多进程一 ...

  7. Numpy库基础___四

    Numpy数据存取 •数据的csv文件的存取 只能有效存取和读取一维和二维数据 a = np.arange(100).reshape(5,20) #用delimiter分割,默认为空格 np.save ...

  8. 【Vulnhub练习】Acid

    靶机信息 下载链接 https://download.vulnhub.com/acid/Acid.rar 靶机说明 Welcome to the world of Acid. Fairy tails ...

  9. OO第一单元

    OO第一单元总结 目录 OO第一单元总结 前言 第一次作业 HW1基本思路 UML类图 代码规模 复杂度分析 方法复杂度 分析 类复杂度 分析 优化策略 第二次作业 HW2基本思路 UML类图 代码规 ...

  10. Struts2里面有什么隐式对象?

    Struts 2.1 的隐式对象 (这些隐式对象都是Map类型) parameters 用于访问请求参数 request 用于访问HttpServletRequest的属性 session 用于访问H ...