SpringCore

package
v1.0.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 24, 2020 License: Apache-2.0 Imports: 19 Imported by: 10

Documentation

Overview

实现了一个完善的 IoC 容器。

Index

Constants

View Source
const (
	ConditionOr   = ConditionOp(1) // 至少一个满足
	ConditionAnd  = ConditionOp(2) // 所有都要满足
	ConditionNone = ConditionOp(3) // 没有一个满足
)
View Source
const (
	ContextEvent_ResolveStart  = ContextEvent(0) // 开始解析 Bean 的过程
	ContextEvent_ResolveEnd    = ContextEvent(1) // 结束解析 Bean 的过程
	ContextEvent_AutoWireStart = ContextEvent(2) // 开始注入 Bean 的过程
	ContextEvent_AutoWireEnd   = ContextEvent(3) // 结束注入 Bean 的过程
	ContextEvent_CloseStart    = ContextEvent(4) // 开始关闭 Context 的过程
	ContextEvent_CloseEnd      = ContextEvent(5) // 结束关闭 Context 的过程
)
View Source
const (
	WiringEvent_Push = WiringEvent(1) // 入栈事件
	WiringEvent_Pop  = WiringEvent(2) // 出栈事件
)

Variables

This section is empty.

Functions

func IsFuncBeanType

func IsFuncBeanType(fnType reflect.Type) bool

IsFuncBeanType 返回是否是合法的函数 Bean 类型

func IsNil

func IsNil(v reflect.Value) bool

IsNil 返回 reflect.Value 的值是否为 nil,比原生方法更安全

func IsRefType

func IsRefType(k reflect.Kind) bool

IsRefType 返回是否是引用类型

func IsValidConverter

func IsValidConverter(t reflect.Type) bool

IsValidConverter 返回是否是合法的类型转换器

func IsValueType

func IsValueType(k reflect.Kind) bool

IsValueType 返回是否是值类型

func NewBeanCondition

func NewBeanCondition(selector interface{}) *beanCondition

NewBeanCondition beanCondition 的构造函数

func NewConditions

func NewConditions(op ConditionOp, cond ...Condition) *conditions

NewConditions conditions 的构造函数

func NewDefaultProperties

func NewDefaultProperties() *defaultProperties

NewDefaultProperties defaultProperties 的构造函数

func NewDefaultSpringContext

func NewDefaultSpringContext() *defaultSpringContext

NewDefaultSpringContext defaultSpringContext 的构造函数

func NewExpressionCondition

func NewExpressionCondition(expression string) *expressionCondition

NewExpressionCondition expressionCondition 的构造函数

func NewFunctionCondition

func NewFunctionCondition(fn ConditionFunc) *functionCondition

NewFunctionCondition functionCondition 的构造函数

func NewMissingBeanCondition

func NewMissingBeanCondition(selector interface{}) *missingBeanCondition

NewMissingBeanCondition missingBeanCondition 的构造函数

func NewMissingPropertyCondition

func NewMissingPropertyCondition(name string) *missingPropertyCondition

NewMissingPropertyCondition missingPropertyCondition 的构造函数

func NewNotCondition

func NewNotCondition(cond Condition) *notCondition

NewNotCondition notCondition 的构造函数

func NewOptionArg

func NewOptionArg(fn interface{}, tags ...string) *optionArg

NewOptionArg optionArg 的构造函数

func NewPriorityProperties added in v1.0.1

func NewPriorityProperties(properties Properties) *priorityProperties

NewPriorityProperties priorityProperties 的构造函数

func NewProfileCondition

func NewProfileCondition(profile string) *profileCondition

NewProfileCondition profileCondition 的构造函数

func NewPropertyCondition

func NewPropertyCondition(name string) *propertyCondition

NewPropertyCondition propertyCondition 的构造函数

func NewPropertyValueCondition

func NewPropertyValueCondition(name string, havingValue interface{}) *propertyValueCondition

NewPropertyValueCondition propertyValueCondition 的构造函数

func ParseBeanId

func ParseBeanId(beanId string) (typeName string, beanName string, nullable bool)

ParseBeanId 解析 BeanId 的内容,"TypeName:BeanName?" 或者 "[]?"

func RegisterTypeConverter

func RegisterTypeConverter(fn interface{})

RegisterTypeConverter 注册类型转换器,用于属性绑定,函数原型 func(string)type

func TypeName

func TypeName(t reflect.Type) string

TypeName 返回原始类型的全限定名,golang 允许不同的路径下存在相同的包,故此有全限定名的需求。 形如 "github.com/go-spring/go-spring/spring-core/SpringCore.DefaultSpringContext"

Types

type BeanDefinition

type BeanDefinition struct {
	// contains filtered or unexported fields
}

BeanDefinition Bean 的详细定义

func FnToBeanDefinition

func FnToBeanDefinition(name string, fn interface{}, tags ...string) *BeanDefinition

FnToBeanDefinition 将构造函数转换为 BeanDefinition 对象

func MethodToBeanDefinition

func MethodToBeanDefinition(name string, selector interface{}, method string, tags ...string) *BeanDefinition

MethodToBeanDefinition 将成员方法转换为 BeanDefinition 对象

func ToBeanDefinition

func ToBeanDefinition(name string, i interface{}) *BeanDefinition

ToBeanDefinition 将 Bean 转换为 BeanDefinition 对象

func ValueToBeanDefinition

func ValueToBeanDefinition(name string, v reflect.Value) *BeanDefinition

ValueToBeanDefinition 将 Value 转换为 BeanDefinition 对象

func (*BeanDefinition) And

func (d *BeanDefinition) And() *BeanDefinition

And c=a&&b

func (*BeanDefinition) AsInterface

func (d *BeanDefinition) AsInterface(exports ...interface{}) *BeanDefinition

AsInterface 指定 Bean 的导出接口

func (*BeanDefinition) Bean

func (d *BeanDefinition) Bean() interface{}

Bean 返回 Bean 的源

func (*BeanDefinition) BeanId

func (d *BeanDefinition) BeanId() string

BeanId 返回 Bean 的 BeanId

func (*BeanDefinition) Caller

func (d *BeanDefinition) Caller() string

Caller 返回 Bean 的注册点

func (*BeanDefinition) ConditionNot

func (d *BeanDefinition) ConditionNot(cond Condition) *BeanDefinition

ConditionNot 为 Bean 设置一个取反的 Condition

func (*BeanDefinition) ConditionOn

func (d *BeanDefinition) ConditionOn(cond Condition) *BeanDefinition

ConditionOn 为 Bean 设置一个 Condition

func (*BeanDefinition) ConditionOnBean

func (d *BeanDefinition) ConditionOnBean(selector interface{}) *BeanDefinition

ConditionOnBean 为 Bean 设置一个 BeanCondition

func (*BeanDefinition) ConditionOnExpression

func (d *BeanDefinition) ConditionOnExpression(expression string) *BeanDefinition

ConditionOnExpression 为 Bean 设置一个 ExpressionCondition

func (*BeanDefinition) ConditionOnMatches

func (d *BeanDefinition) ConditionOnMatches(fn ConditionFunc) *BeanDefinition

ConditionOnMatches 为 Bean 设置一个 FunctionCondition

func (*BeanDefinition) ConditionOnMissingBean

func (d *BeanDefinition) ConditionOnMissingBean(selector interface{}) *BeanDefinition

ConditionOnMissingBean 为 Bean 设置一个 MissingBeanCondition

func (*BeanDefinition) ConditionOnMissingProperty

func (d *BeanDefinition) ConditionOnMissingProperty(name string) *BeanDefinition

ConditionOnMissingProperty 为 Bean 设置一个 MissingPropertyCondition

func (*BeanDefinition) ConditionOnProfile

func (d *BeanDefinition) ConditionOnProfile(profile string) *BeanDefinition

ConditionOnProfile 为 Bean 设置一个 ProfileCondition

func (*BeanDefinition) ConditionOnProperty

func (d *BeanDefinition) ConditionOnProperty(name string) *BeanDefinition

ConditionOnProperty 为 Bean 设置一个 PropertyCondition

func (*BeanDefinition) ConditionOnPropertyValue

func (d *BeanDefinition) ConditionOnPropertyValue(name string, havingValue interface{}) *BeanDefinition

ConditionOnPropertyValue 为 Bean 设置一个 PropertyValueCondition

func (*BeanDefinition) DependsOn

func (d *BeanDefinition) DependsOn(selector ...interface{}) *BeanDefinition

DependsOn 设置 Bean 的非直接依赖

func (*BeanDefinition) Description

func (d *BeanDefinition) Description() string

Description 返回 Bean 的详细描述

func (*BeanDefinition) Destroy

func (d *BeanDefinition) Destroy(fn interface{}) *BeanDefinition

Destroy 设置 Bean 销毁时的回调

func (*BeanDefinition) Init

func (d *BeanDefinition) Init(fn interface{}) *BeanDefinition

Init 设置 Bean 初始化的回调

func (*BeanDefinition) Match

func (d *BeanDefinition) Match(typeName string, beanName string) bool

Match 测试 Bean 的类型全限定名和 Bean 的名称是否都匹配

func (*BeanDefinition) Matches

func (d *BeanDefinition) Matches(ctx SpringContext) bool

Matches 成功返回 true,失败返回 false

func (*BeanDefinition) Name

func (d *BeanDefinition) Name() string

Name 返回 Bean 的名称

func (*BeanDefinition) Options

func (d *BeanDefinition) Options(options ...*optionArg) *BeanDefinition

Options 设置 Option 模式函数的参数绑定

func (*BeanDefinition) Or

func (d *BeanDefinition) Or() *BeanDefinition

Or c=a||b

func (*BeanDefinition) Primary

func (d *BeanDefinition) Primary(primary bool) *BeanDefinition

Primary 设置 Bean 的优先级

func (*BeanDefinition) Type

func (d *BeanDefinition) Type() reflect.Type

Type 返回 Bean 的类型

func (*BeanDefinition) TypeName

func (d *BeanDefinition) TypeName() string

TypeName 返回 Bean 的原始类型的全限定名

func (*BeanDefinition) Value

func (d *BeanDefinition) Value() reflect.Value

Value 返回 Bean 的值

type Condition

type Condition interface {
	// Matches 成功返回 true,失败返回 false
	Matches(ctx SpringContext) bool
}

Condition 定义一个判断条件

type ConditionFunc

type ConditionFunc func(ctx SpringContext) bool

ConditionFunc 定义 Condition 接口 Matches 方法的类型

type ConditionOp

type ConditionOp int

ConditionOp conditionNode 的计算方式

type Conditional

type Conditional struct {
	// contains filtered or unexported fields
}

Conditional Condition 计算式

func NewConditional

func NewConditional() *Conditional

NewConditional Conditional 的构造函数

func (*Conditional) And

func (c *Conditional) And() *Conditional

And c=a&&b

func (*Conditional) Empty

func (c *Conditional) Empty() bool

Empty 返回表达式是否为空

func (*Conditional) Matches

func (c *Conditional) Matches(ctx SpringContext) bool

Matches 成功返回 true,失败返回 false

func (*Conditional) OnBean

func (c *Conditional) OnBean(selector interface{}) *Conditional

OnBean 设置一个 beanCondition

func (*Conditional) OnCondition

func (c *Conditional) OnCondition(cond Condition) *Conditional

OnCondition 设置一个 Condition

func (*Conditional) OnConditionNot

func (c *Conditional) OnConditionNot(cond Condition) *Conditional

OnConditionNot 设置一个取反的 Condition

func (*Conditional) OnExpression

func (c *Conditional) OnExpression(expression string) *Conditional

OnExpression 设置一个 expressionCondition

func (*Conditional) OnMatches

func (c *Conditional) OnMatches(fn ConditionFunc) *Conditional

OnMatches 设置一个 functionCondition

func (*Conditional) OnMissingBean

func (c *Conditional) OnMissingBean(selector interface{}) *Conditional

OnMissingBean 设置一个 missingBeanCondition

func (*Conditional) OnMissingProperty

func (c *Conditional) OnMissingProperty(name string) *Conditional

OnMissingProperty 设置一个 missingPropertyCondition

func (*Conditional) OnProfile

func (c *Conditional) OnProfile(profile string) *Conditional

OnProfile 设置一个 profileCondition

func (*Conditional) OnProperty

func (c *Conditional) OnProperty(name string) *Conditional

OnProperty 设置一个 propertyCondition

func (*Conditional) OnPropertyValue

func (c *Conditional) OnPropertyValue(name string, havingValue interface{}) *Conditional

OnPropertyValue 设置一个 propertyValueCondition

func (*Conditional) Or

func (c *Conditional) Or() *Conditional

Or c=a||b

type ContextEvent

type ContextEvent int

ContextEvent 定义 SpringContext 事件类型

type IBeanDefinition

type IBeanDefinition interface {
	Bean() interface{}    // 源
	Type() reflect.Type   // 类型
	Value() reflect.Value // 值
	TypeName() string     // 原始类型的全限定名

	Name() string        // 返回 Bean 的名称
	BeanId() string      // 返回 Bean 的 BeanId
	Caller() string      // 返回 Bean 的注册点
	Description() string // 返回 Bean 的详细描述
	// contains filtered or unexported methods
}

IBeanDefinition 对 BeanDefinition 的抽象接口

type Properties

type Properties interface {
	// LoadProperties 加载属性配置文件,
	// 支持 properties、yaml 和 toml 三种文件格式。
	LoadProperties(filename string)

	// ReadProperties 读取属性配置文件,
	// 支持 properties、yaml 和 toml 三种文件格式。
	ReadProperties(reader io.Reader, configType string)

	// GetProperty 返回属性值,属性名称统一转成小写。
	GetProperty(keys ...string) interface{}

	// GetBoolProperty 返回布尔型属性值,属性名称统一转成小写。
	GetBoolProperty(keys ...string) bool

	// GetIntProperty 返回有符号整型属性值,属性名称统一转成小写。
	GetIntProperty(keys ...string) int64

	// GetUintProperty 返回无符号整型属性值,属性名称统一转成小写。
	GetUintProperty(keys ...string) uint64

	// GetFloatProperty 返回浮点型属性值,属性名称统一转成小写。
	GetFloatProperty(keys ...string) float64

	// GetStringProperty 返回字符串型属性值,属性名称统一转成小写。
	GetStringProperty(keys ...string) string

	// GetDurationProperty 返回 Duration 类型属性值,属性名称统一转成小写。
	GetDurationProperty(keys ...string) time.Duration

	// GetTimeProperty 返回 Time 类型的属性值,属性名称统一转成小写。
	GetTimeProperty(keys ...string) time.Time

	// GetDefaultProperty 返回属性值,如果没有找到则使用指定的默认值,属性名称统一转成小写。
	GetDefaultProperty(key string, def interface{}) (interface{}, bool)

	// SetProperty 设置属性值,属性名称统一转成小写。
	SetProperty(key string, value interface{})

	// GetPrefixProperties 返回指定前缀的属性值集合,属性名称统一转成小写。
	GetPrefixProperties(prefix string) map[string]interface{}

	// GetProperties 返回所有的属性值,属性名称统一转成小写。
	GetProperties() map[string]interface{}

	// BindProperty 根据类型获取属性值,属性名称统一转成小写。
	BindProperty(key string, i interface{})

	// BindPropertyIf 根据类型获取属性值,属性名称统一转成小写。
	BindPropertyIf(key string, i interface{}, allAccess bool)
}

定义属性值接口

type SpringBean

type SpringBean interface {
	Bean() interface{}    // 源
	Type() reflect.Type   // 类型
	Value() reflect.Value // 值
	TypeName() string     // 原始类型的全限定名
	// contains filtered or unexported methods
}

SpringBean Bean 源接口

type SpringContext

type SpringContext interface {

	// 属性值列表接口
	Properties

	// 上下文接口
	context.Context

	// GetProfile 返回运行环境
	GetProfile() string

	// SetProfile 设置运行环境
	SetProfile(profile string)

	// AllAccess 返回是否允许访问私有字段
	AllAccess() bool

	// SetAllAccess 设置是否允许访问私有字段
	SetAllAccess(allAccess bool)

	// SetEventNotify 设置 Context 事件通知函数
	SetEventNotify(notify func(event ContextEvent))

	// RegisterBean 注册单例 Bean,不指定名称,重复注册会 panic。
	RegisterBean(bean interface{}) *BeanDefinition

	// RegisterNameBean 注册单例 Bean,需指定名称,重复注册会 panic。
	RegisterNameBean(name string, bean interface{}) *BeanDefinition

	// RegisterBeanFn 注册单例构造函数 Bean,不指定名称,重复注册会 panic。
	RegisterBeanFn(fn interface{}, tags ...string) *BeanDefinition

	// RegisterNameBeanFn 注册单例构造函数 Bean,需指定名称,重复注册会 panic。
	RegisterNameBeanFn(name string, fn interface{}, tags ...string) *BeanDefinition

	// RegisterMethodBean 注册成员方法单例 Bean,不指定名称,重复注册会 panic。
	// selector 可以是 *BeanDefinition,可以是 BeanId,还可以是 (Type)(nil) 变量。
	// 必须给定方法名而不能通过遍历方法列表比较方法类型的方式获得函数名,因为不同方法的类型可能相同。
	// 而且 interface 的方法类型不带 receiver 而成员方法的类型带有 receiver,两者类型不好匹配。
	RegisterMethodBean(selector interface{}, method string, tags ...string) *BeanDefinition

	// RegisterNameMethodBean 注册成员方法单例 Bean,需指定名称,重复注册会 panic。
	// selector 可以是 *BeanDefinition,可以是 BeanId,还可以是 (Type)(nil) 变量。
	// 必须给定方法名而不能通过遍历方法列表比较方法类型的方式获得函数名,因为不同方法的类型可能相同。
	// 而且 interface 的方法类型不带 receiver 而成员方法的类型带有 receiver,两者类型不好匹配。
	RegisterNameMethodBean(name string, selector interface{}, method string, tags ...string) *BeanDefinition

	// AutoWireBeans 完成自动绑定
	AutoWireBeans(watchers ...WiringWatcher)

	// WireBean 绑定外部的 Bean 源
	WireBean(bean interface{}, watchers ...WiringWatcher)

	// GetBean 根据类型获取单例 Bean,若多于 1 个则 panic;找到返回 true 否则返回 false。
	// 什么情况下会多于 1 个?假设 StructA 实现了 InterfaceT,而且用户在注册时使用了
	// StructA 的指针注册多个 Bean,如果在获取时使用 InterfaceT,则必然出现多于 1 个的情况。
	GetBean(i interface{}, watchers ...WiringWatcher) bool

	// GetBeanByName 根据名称和类型获取单例 Bean,若多于 1 个则 panic;找到返回 true 否则返回 false。
	// 什么情况下会多于 1 个?假设 StructA 和 StructB 都实现了 InterfaceT,而且用户在注册时使用了相
	// 同的名称分别注册了 StructA 和 StructB 的 Bean,这时候如果使用 InterfaceT 去获取,就会出现多于 1 个的情况。
	GetBeanByName(beanId string, i interface{}, watchers ...WiringWatcher) bool

	// FindBean 获取单例 Bean,若多于 1 个则 panic;找到返回 true 否则返回 false。
	// selector 可以是 BeanId,还可以是 (Type)(nil) 变量,Type 为接口类型时带指针。
	FindBean(selector interface{}) (*BeanDefinition, bool)

	// FindBeanByName 根据名称和类型获取单例 Bean,若多于 1 个则 panic;找到返回 true 否则返回 false。
	FindBeanByName(beanId string) (*BeanDefinition, bool)

	// CollectBeans 收集数组或指针定义的所有符合条件的 Bean 对象,收集到返回 true,否则返回 false。
	// 什么情况下可以使用此功能?假设 HandlerA 和 HandlerB 都实现了 HandlerT 接口,而且用户分别注册
	// 了一个 HandlerA 和 HandlerB 对象,如果用户想要同时获取 HandlerA 和 HandlerB 对象,那么他可
	// 以通过 []HandlerT 即数组的方式获取到所有 Bean。
	CollectBeans(i interface{}, watchers ...WiringWatcher) bool

	// GetBeanDefinitions 获取所有 Bean 的定义,一般仅供调试使用。
	GetBeanDefinitions() []*BeanDefinition

	// Close 关闭容器上下文,用于通知 Bean 销毁等。
	Close()
}

SpringContext 定义 IoC 容器接口,Bean 的注册规则:

  1. AutoWireBeans 开始后不允许注册新的 Bean(性能考虑)

type WiringEvent

type WiringEvent int

WiringEvent 注入堆栈的事件

type WiringWatcher

type WiringWatcher func(bd IBeanDefinition, event WiringEvent)

WiringWatcher 注入过程监视器

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL