fx简单学习应用。

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

下面是最简单的demo使用。

go 复制代码
package main

import (
	"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 string

var 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)
		},
	})
}

模块化管理

go 复制代码
package modu

import (
	"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/

相关推荐
知识分享小能手12 小时前
uni-app 入门学习教程,从入门到精通,uni-app组件 —— 知识点详解与实战案例(4)
前端·javascript·学习·微信小程序·小程序·前端框架·uni-app
wahkim12 小时前
Flutter 学习资源及视频
学习
小白要努力sgy12 小时前
待学习--中间件
学习·中间件
~无忧花开~13 小时前
CSS学习笔记(五):CSS媒体查询入门指南
开发语言·前端·css·学习·媒体
吴鹰飞侠13 小时前
AJAX的学习
前端·学习·ajax
我的xiaodoujiao13 小时前
使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 19--测试框架Pytest基础 3--前后置操作应用
python·学习·测试工具·pytest
lzj_pxxw13 小时前
嵌入式开发技巧:舍弃标志位,用宏定义函数实现程序单次运行
笔记·stm32·单片机·嵌入式硬件·学习
江苏世纪龙科技14 小时前
【世纪龙科技】新能源汽车动力电池拆装与检测虚拟实训软件介绍
学习
whale fall14 小时前
与deepseek用英语聊天的第一天
学习
dxnb2215 小时前
Datawhale25年10月组队学习:math for AI+Task3线性代数(下)
人工智能·学习·线性代数