# func-spring-boot-starter
**Repository Path**: yiur/func-spring-boot-starter
## Basic Information
- **Project Name**: func-spring-boot-starter
- **Description**: 匿名函数托管
匿名函数链接
服务熔断
基与SpringBoot2.6.x
- **Primary Language**: Java
- **License**: MulanPSL-2.0
- **Default Branch**: main
- **Homepage**: https://github.com/yiurhub
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2022-03-31
- **Last Updated**: 2022-06-20
## Categories & Tags
**Categories**: Uncategorized
**Tags**: SpringBoot, Java, Spring, Web
## README
# func-spring-boot-starter 匿名函数托管
> GitHub项目路径:
```http
https://github.com/yiurhub/func-spring-boot-starter
```
> Gitee项目路径:
```http
https://gitee.com/yiur/func-spring-boot-starter
```
## 使用注意事项
> 推荐版本:
```xml
io.github.yiurhub
func-spring-boot-starter
1.1.38
```
## 设计原理

## 匿名函数特性
### 匿名函数链接配置
### Yaml
```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操作
详细内容请看项目:
```http
https://gitee.com/yiur/func-spring-boot-starter/tree/main/func-web-simple
```
```java
@Configuration
@EnableFuncLambda("com.simple.web.lambda")
public class FuncLinkConfig {
@Autowired
public FuncLinkFactory funcLinkFactory;
@Bean
public FuncLink funcLink() {
return funcLinkFactory.build()
.setObject("logger:log", (set, log) -> "logger => ${methodName}\r\n");
}
}
```
### 严格类型托管
开发推荐**严格类型托管**,有代码提示,开发效率更高,在Web项目中,可以托管整个**Servcie**层
配合Mybaits,Redis等框架一起使用
**1、定义接口**
用于SpringBoot自动注入funcLink代理的HttpLink类
```java
public interface HttpLink {
Object link();
}
```
**2、代理类代理接口方法**
`@FuncBean(link = "funcLink Bean Name")`
添加类注解`@FuncBean`声明这是一个匿名函数代理类
添加方法注解`@FuncLambda`声明这是一个代理方法
如果有参数请加上参数注解`@FuncParameter("参数名")`
```java
@Component
@FuncBean
public class FuncLinkHosting implements HttpLink {
@Override
@FuncLambda(classFile = HttpLink.class)
public Map link() {
Map 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插件提升
```java
@Component
public interface HttpLink {
Object link();
}
```
**2、代理类代理接口方法**
@FuncBean(link = "funcLink Bean Name")
松散类型托管需要注意的事项:
1. 代理方法返回值与接口不一样,接口返回值必须得是Object
添加类注解`@FuncBean`声明这是一个匿名函数代理类
添加方法注解`@FuncLambda`声明这是一个代理方法
如果有参数请加上参数注解`@FuncParameter("参数名")`
```java
@FuncBean
public class FuncLinkHosting {
@FuncLambda(classFile = HttpLink.class)
public Map link() {
Map 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文件夹下
```java
@FuncBean
public class FuncLinkHosting implements HttpLink {
@Override
@FuncLogger
@FuncLambda(classFile = HttpLink.class)
public Map link() {
Map 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"**
#### 代码
```java
@Configuration
@EnableFuncLambda("com.simple.web.lambda")
public class FuncLinkConfig {
@Autowired
public FuncLinkFactory funcLinkFactory;
@Bean
public FuncLink funcLink() {
return funcLinkFactory.build()
.setObject("httpLink:log", (set, log) -> "logger => ${methodName}\r\n");
}
}
```
### @FuncCallback 注解实现
添加方法注解`@FuncCallback`绑定方法执行后的回调函数
成功执行回调: `then(T result)`
失败执行回调: `error(Throwable e)`
```java
public class DefaultCallback implements FuncCallback {
@Override
public Object then(Object data) { return data; }
@Override
public Object error(Throwable error) {
return error.getMessage();
}
}
```
```java
@FuncBean
public class FuncLinkHosting implements HttpLink {
@Override
@FuncCallback(DefaultCallback.class)
@FuncLambda(classFile = HttpLink.class)
public Map link() {
Map 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`约束参数值和返回值,**执行优先级: 1**
功能链接为: **"${Bean Name}:callback"**
`FuncCallbackThen`约束参数值和返回值,**执行优先级: 2**
功能链接为: **"${Bean Name}:callback-then"**
`FuncCallbackError`约束返回值,**执行优先级: 2**
功能链接为: **"${Bean Name}:callback-error"**
#### 代码
```java
@Configuration
@EnableFuncLambda("com.simple.web.lambda")
public class FuncLinkConfig {
@Autowired
public FuncLinkFactory funcLinkFactory;
@Bean("simple")
public FuncLink funcLink() {
return funcLinkFactory.build()
// httpLink
., Object>>setObject("httpLink:callback", new FuncCallback