Skip to content
This repository was archived by the owner on Feb 10, 2023. It is now read-only.

zeromake/spring-web-demo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

26 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

go-spring web service demo

一、目标

  1. 尝试使用 go-spring 做到 controller 注入 service 的引用。
  2. 做到导入 controller 即可自动注册路由,初始化 controller 上的 service 实例。
  3. 尝试两个不同文件访问逻辑实现通过配置切换做到实例化不同文件存储到对应的 controller

二、实现方案

controller 注入在 types 包的 FileProvider 接口

package upload

import (
	SpringWeb "github.com/go-spring/go-spring-web/spring-web"
	"github.com/zeromake/spring-web-demo/types"
)

type Controller struct {
	File types.FileProvider `autowire:""`
}


func init() {
	SpringBoot.RegisterBean(new(Controller)).Init(func(c *Controller) {
		SpringBoot.PostMapping("/upload", c.Upload)
	})
}

func (c *Controller) Upload(ctx SpringWeb.WebContext) {
    // ……
}

types 声明需要的文件操作接口类型

package types
import (
	SpringBoot "github.com/go-spring/go-spring/spring-boot"
    "io"
    "os"
)


type ReadCloserAt interface {
	io.Reader
	io.Closer
	io.ReaderAt
}

type FileProvider interface {
	PutObject(name string, r io.Reader, size int64) error
	GetObject(name string) (ReadCloserAt, error)
	RemoveObject(name string) error
	StatObject(name string) (os.FileInfo, error)
	ExistObject(name string) bool
}
type FileProviderStarter interface {
	FileProvider
	OnStartApplication(ctx SpringBoot.ApplicationContext)
	OnStopApplication(ctx SpringBoot.ApplicationContext)
}

modules 部分为通用对象注入例如 minioClient 连接对象,数据库之类的

package minio
func init() {
    SpringBoot.RegisterNameBeanFn(
        "minioClient",
        func(config MinioConfig) *minio.Client {
            return nil
        },
        "0:${}",
    ).ConditionOnPropertyValue(
        "minio.enable",
        true,
    )
}

services 部分为通过配置实现对应的文件操作接口对象,自行到代码中查看

主要介绍 service 如何切换注入

local.go

package local
func init() {
	var s = new(Service)
    // 没有注入 minioClient 对象才注入
	SpringBoot.RegisterBean(s).AsInterface((*types.FileProvider)(nil)).ConditionOnMissingBean("minioClient")
}

minio.go

package minio
func init() {
	var s = new(Service)
    // 注入了 minioClient 对象才注入
	SpringBoot.RegisterBean(s).AsInterface((*types.FileProvider)(nil)).ConditionOnBean("minioClient")
}

使用以上的方案就能做到配置切换也切换注入

main 把以上的 controller 和 module 导入即可自动 ioc。

package main

import (
	SpringBoot "github.com/go-spring/go-spring/spring-boot"

	_ "github.com/go-spring/go-spring-boot-starter/starter-gin"
	_ "github.com/go-spring/go-spring-boot-starter/starter-web"
	_ "github.com/zeromake/spring-web-demo/controllers"
	_ "github.com/zeromake/spring-web-demo/modules"
	_ "github.com/zeromake/spring-web-demo/services"
)

func main() {
	SpringBoot.RunApplication("config/")
}

二、运行实例验证

# 启动一个 minio 服务作为远端文件支持
docker-compose up -d minio

修改 config/application.toml 里的 [minio] 下的 enable 来切换文件的存储能力。

demo 里默认使用 minio 存储文件。

运行 go run main.go 启动服务

通过 curl 模拟上传

curl -F "file=@./README.md" http://127.0.0.1:8080/upload

可以通过 http://127.0.0.1:9000 登录查看是否把文件存到了 minio

修改 config/application.toml 里的 [minio] 下的 enable = false 重新运行再次上传会发现存到了本地

About

使用 go-spring 来做自动对象注入的例子

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages