fx简单学习应用。

embedded/2025/1/18 21:08:44/

fx是一个golang的依赖注入框架,主要的内容有几个注入方法,以及钩子函数

下面是最简单的demo使用。

package mainimport ("context""fx_demo/modu""log""net/http""go.uber.org/fx"
)// Invoke 注册的函数的运行是有顺序的,而 Provide 注入的构造函数并没有顺序
func main() {app := fx.New(modu.Module,fx.Provide( //构造函数,依赖的内容可以自动注入,依赖的内容在方法入参中,会从容器注入NewHTTPServer,NewGreetingService,),fx.Supply(stu), // 函数传入的参数是已经构造完毕的值(value),也就是说 Provide(NewC) → Supply(C) , 其中 C = NewC(…)// 当其他构造函数依赖于类型C时,不通过调用 NewC 生成,而是直接使用提供的 C。fx.Populate(), //中传入的targets必须得是目标类型TypeX的指针类型 *TypeX,哪怕 TypeX 本身就是指针类型// populate方法传入一个指针,指针的值从容器中注入fx.Invoke(RegisterHTTPServer), //注册一些在app启动时需要执行的函数,被注册的 func 的入参,通过 Provide 注入的构造函数生成)app.Run()
}type Student stringvar stu Student = "leon"// HTTP服务器
type HTTPServer struct {server *http.Server
}func NewHTTPServer() *HTTPServer {return &HTTPServer{server: &http.Server{Addr: ":8080",},}
}// 问候服务
type GreetingService interface {Greet() string
}type greetingService struct{}func NewGreetingService() GreetingService {return &greetingService{}
}func (s *greetingService) Greet() string {return "Hello, FX!"
}// 注册HTTP处理函数
func RegisterHTTPServer(lc fx.Lifecycle, server *HTTPServer, greeting GreetingService) {mux := http.NewServeMux()mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {w.Write([]byte(greeting.Greet()))})server.server.Handler = mux// 添加钩子函数lc.Append(fx.Hook{OnStart: func(ctx context.Context) error {log.Println("Starting HTTP server on :8080")go server.server.ListenAndServe()return nil},OnStop: func(ctx context.Context) error {log.Println("Stopping HTTP server")return server.server.Shutdown(ctx)},})
}

模块化管理

package moduimport ("go.uber.org/fx""go.uber.org/zap"
)// 使用这个方法!
var Module = fx.Options(fx.Provide(ProvideLogger),
)func ProvideLogger() *zap.Logger {return zap.NewExample()
}

参考:
https://karlvenk.github.io/2022/10/02/fx-md/


http://www.ppmy.cn/embedded/155045.html

相关文章

栈和队列(数据结构初阶)

文章目录 栈和队列一:栈1.1概念与结构1.2底层逻辑1.3栈的实现结构定义判空入栈出栈取栈顶元素获取栈中有效数据个数 二:队列2.1概念与结构2.2底层逻辑2.3 队列的实现结构定义初始化入队判空出队取数据有效数据个数 三:结语 欢迎大家来到我的博…

Spring Boot 全局异常处理

在开发任何应用程序时,异常处理都是至关重要的。一个良好的异常处理机制不仅能提高用户体验,还能帮助开发者更好地定位和修复问题。Spring Boot 提供了强大的异常处理能力,使我们能够集中处理应用程序中抛出的各种异常,从而构建更…

css‘s hover VS mobile

.animation {animation: 30s move infinite linear;/* &:hover {animation-play-state: paused;*/ }原本写的好好的,测试说:“移动端点击滚动条,跳转到其他页面后,返回当前页面,滚动条不滚动;可以优化位…

ubuntu 系统 ,docker建的服务 ,其他局网机器可以通过IP:端口的方式访问。不是docker的不行。

根据您的描述,docker 建的服务可以通过 IP:端口的方式被局网其他机器访问,而非 docker 的服务不行,以下是可能的原因及解决方法: 网络配置方面 • 检查非 docker 服务的网络监听配置:确保非 docker 服务是…

解决postman打开一直转圈圈的问题

Postman 打开时一直转圈圈的问题可能是由多种原因引起的。以下是一些常见的解决方法,你可以逐一尝试: 1. 重启 Postman 有时,简单的重启可以解决许多问题。 关闭 Postman。重新打开 Postman。 2. 清除缓存 Postman 有时会因为缓存问题导…

2021年前端部署的灵魂拷问

注意,缓存生效期间,浏览器是【自言自语】,和服务器无关。 此时,设置强缓存后,Network 大致变成了这样: image.png From DiskCache:从硬盘中读取。 From MemoryCache:从内存中读取&am…

Redis Cluster 集群

1. Redis Cluster 简介 Redis Cluster 是 Redis 官方提供的 Redis 集群功能。 为什么要实现 Redis Cluster? Redis 是单线程的(从网络 I/O 处理到实际的读写命令处理),无论单核 CPU 下内存多大,如果需要大量计算能力…

25/1/17 嵌入式笔记 STM32F103

#include "stm32f10x.h" // Device header #include "Delay.h" #include "OLED.h" #include "Serial.h"uint8_t RxData; //定义用于接收串口数据的变量int main(void) {/*模块初始化*/OLED_Init(); //OLED初始化/…