代码拉取完成,页面将自动刷新
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")
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。