func (a *BaseApplication) SystemConfig() *system.Configuration {
	return a.systemConfig
}
SystemConfig returns application config
package app
import (
	"errors"
	"fmt"
	"hidevops.io/hiboot/pkg/app/web/context"
	"hidevops.io/hiboot/pkg/factory"
	"hidevops.io/hiboot/pkg/factory/autoconfigure"
	"hidevops.io/hiboot/pkg/factory/instantiate"
	"hidevops.io/hiboot/pkg/log"
	"hidevops.io/hiboot/pkg/system"
	"hidevops.io/hiboot/pkg/utils/cmap"
	"hidevops.io/hiboot/pkg/utils/io"
	"reflect"
	"strings"
	"sync"
)
const (
	ApplicationContextName = "app.applicationContext"
	ContextPathFormat = "server.context_path_format"
	ContextPathFormatKebab = "kebab"
	ContextPathFormatSnake = "snake"
	ContextPathFormatCamel = "camel"
	ContextPathFormatLowerCamel = "lower-camel"
)
type Application interface {
	Initialize() error
	SetProperty(name string, value ...interface{}) Application
	GetProperty(name string) (value interface{}, ok bool)
	SetAddCommandLineProperties(enabled bool) Application
	Run()
}
type ApplicationContext interface {
	RegisterController(controller interface{}) error
	Use(handlers ...context.Handler)
	GetProperty(name string) (value interface{}, ok bool)
	GetInstance(params ...interface{}) (instance interface{})
}
type BaseApplication struct {
	WorkDir             string
	configurations      cmap.ConcurrentMap
	instances           cmap.ConcurrentMap
	potatoes            cmap.ConcurrentMap
	configurableFactory factory.ConfigurableFactory
	systemConfig        *system.Configuration
	postProcessor       *postProcessor
	defaultProperties   cmap.ConcurrentMap
	mu                  sync.Mutex
	addCommandLineProperties bool
}
var (
	configContainer    []*factory.MetaData
	componentContainer []*factory.MetaData
	ErrInvalidObjectType = errors.New("[app] invalid Configuration type, one of app.Configuration need to be embedded")
	banner = `
______  ____________             _____
___  / / /__(_)__  /_______________  /_
__  /_/ /__  /__  __ \  __ \  __ \  __/   
_  __  / _  / _  /_/ / /_/ / /_/ / /_     Hiboot Application Framework
/_/ /_/  /_/  /_.___/\____/\____/\__/     https: 
`
)
func (a *BaseApplication) PrintStartupMessages() {
	if !a.systemConfig.App.Banner.Disabled {
		fmt.Print(banner)
	}
}
func (a *BaseApplication) SetProperty(name string, value ...interface{}) Application {
	var val interface{}
	if len(value) == 1 {
		val = value[0]
	} else {
		val = value
	}
	kind := reflect.TypeOf(val).Kind()
	if kind == reflect.String && strings.Contains(val.(string), ",") {
		val = strings.SplitN(val.(string), ",", -1)
	}
	a.defaultProperties.Set(name, val)
	return a
}
func (a *BaseApplication) GetProperty(name string) (value interface{}, ok bool) {
	value, ok = a.defaultProperties.Get(name)
	return
}
func (a *BaseApplication) Initialize() (err error) {
	log.SetLevel(log.InfoLevel)
	a.defaultProperties = cmap.New()
	a.configurations = cmap.New()
	a.instances = cmap.New()
	a.SetAddCommandLineProperties(true)
	return nil
}
func (a *BaseApplication) Build() {
	a.mu.Lock()
	defer a.mu.Unlock()
	a.WorkDir = io.GetWorkDir()
	instantiateFactory := instantiate.NewInstantiateFactory(a.instances, componentContainer, a.defaultProperties)
	configurableFactory := autoconfigure.NewConfigurableFactory(instantiateFactory, a.configurations)
	a.configurableFactory = configurableFactory
	a.postProcessor = newPostProcessor(instantiateFactory)
	a.systemConfig, _ = configurableFactory.BuildProperties()
	log.SetLevel(a.systemConfig.Logging.Level)
}