1 Star 2 Fork 3

kristas/booting-go

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
boot.go 3.42 KB
一键复制 编辑 原始数据 按行查看 历史
kristas 提交于 2021-03-23 17:36 . feat: add cache framework
package framework
import (
"flag"
"gitee.com/kristas/booting-go/framework/bean"
. "gitee.com/kristas/booting-go/framework/bean/bean_factory"
"gitee.com/kristas/booting-go/framework/common/tool/reflectx"
"gitee.com/kristas/booting-go/framework/config_loader"
logRegisters "gitee.com/kristas/booting-go/framework/logging/registers"
"github.com/sirupsen/logrus"
"reflect"
"strings"
)
var app *BootApplication
type BootApplication struct {
Log *logrus.Logger `bean:"log"`
Server Server `value:"server"`
Logging Logging `value:"logging"`
components bean.Components
}
type Server struct {
Name string `json:"name" yaml:"name"`
Port int `json:"port" yaml:"port"`
}
type Logging struct {
Level string `json:"level" yaml:"level"`
Instance string `json:"instance" yaml:"instance"`
}
func init() {
initFlag()
config_loader.DefaultLocalConfigReader(environment)
app = new(BootApplication)
config_loader.InjectStructure(app)
registerInnerBeans()
Autowired(app)
}
var innerBeanRegisters = []func(){
logRegisters.RegisterDefaultLogger,
}
func registerInnerBeans() {
for i := range innerBeanRegisters {
innerBeanRegisters[i]()
}
}
var (
environment string
port int
OpenBrowser bool
)
func initFlag() {
flag.StringVar(&environment, "env", "local", "local,dev,test,prod...")
flag.IntVar(&port, "p", 0, "the port your server listen at.")
flag.BoolVar(&OpenBrowser, "bs", false, "open browser after server start")
flag.Parse()
}
func Application() *BootApplication {
return app
}
func (r *BootApplication) Run(args ...string) {
r.Log.WithField("env", environment).Info("environment")
r.useComponent()
}
func (r *BootApplication) Use(c ...bean.Bean) *BootApplication {
r.components = append(r.components, c...)
return r
}
var beanInitQueue = []func(b bean.Bean){
registerComponents, //注册容器
injectValue, //注入configure
afterPropertiesSet, //依赖configure创建新容器的容器初始化
injectComponents, //依赖注入
initComponents, //初始化容器
callControllerMethod, //注册controller路由方法
startWebContainer, //启动容器
}
func (r *BootApplication) useComponent() {
for i := range beanInitQueue {
for j := range r.components {
beanInitQueue[i](r.components[j])
}
}
}
func registerComponents(b bean.Bean) {
beanName := b.Bean()
if beanName == "" {
Register(b)
} else {
RegisterWithName(beanName, b)
}
}
func injectValue(b bean.Bean) {
config_loader.InjectStructure(b)
}
func afterPropertiesSet(b bean.Bean) {
reflectx.TryCallMethod(b, "AfterPropertiesSet")
}
func injectComponents(b bean.Bean) {
Autowired(b)
}
func initComponents(b bean.Bean) {
reflectx.TryCallMethod(b, "Init")
}
func callControllerMethod(b bean.Bean) {
var beanName = GetBeanName2(b)
if isController(beanName) {
handleControllerMethod(b)
}
}
func isController(beanName string) bool {
return strings.Contains(strings.ToLower(beanName), "controller")
}
func handleControllerMethod(b bean.Bean) {
v := reflect.ValueOf(b)
for i := 0; i < v.NumMethod(); i++ {
method := v.Method(i)
if method.IsValid() {
method.Call(nil)
}
}
}
func startWebContainer(b bean.Bean) {
if isWebContainer(b.Bean()) {
var p int
if port != 0 {
p = port
} else {
p = app.Server.Port
}
reflectx.TryCallMethod(b, "ListenAndServe", p)
}
}
func isWebContainer(beanName string) bool {
return strings.Contains(strings.ToLower(beanName), "web_container")
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/kristas/booting-go.git
git@gitee.com:kristas/booting-go.git
kristas
booting-go
booting-go
v1.1.2

搜索帮助