FieldAnnotation is added
This commit is contained in:
parent
d08fa9dbe7
commit
d7ef4e8d24
|
@ -16,6 +16,7 @@ type TypeDefinition struct {
|
|||
RealType reflect.Type
|
||||
|
||||
TypeAnnotations map[reflect.Type]annotation.Annotation
|
||||
FieldAnnotations map[string]map[reflect.Type]annotation.Annotation
|
||||
MethodAnnotations map[string]map[reflect.Type]annotation.Annotation
|
||||
Fields []*FieldDefinition
|
||||
}
|
||||
|
@ -44,6 +45,36 @@ func (td *TypeDefinition) GetTypeAnnotationByType(at reflect.Type, includeEmbedd
|
|||
return nil
|
||||
}
|
||||
|
||||
func (td *TypeDefinition) GetFieldAnnotationByType(at reflect.Type, methodName string) annotation.Annotation {
|
||||
if nil == td.FieldAnnotations {
|
||||
return nil
|
||||
}
|
||||
|
||||
fs, ok := td.FieldAnnotations[methodName]
|
||||
if !ok {
|
||||
return nil
|
||||
}
|
||||
|
||||
return fs[at]
|
||||
}
|
||||
|
||||
func (td *TypeDefinition) GetFieldAnnotationsByType(at reflect.Type) map[string]annotation.Annotation {
|
||||
if nil == td.FieldAnnotations {
|
||||
return nil
|
||||
}
|
||||
|
||||
fas := make(map[string]annotation.Annotation)
|
||||
for k, v := range td.FieldAnnotations {
|
||||
a, ok := v[at]
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
fas[k] = a
|
||||
}
|
||||
|
||||
return fas
|
||||
}
|
||||
|
||||
func (td *TypeDefinition) GetMethodAnnotationByType(at reflect.Type, methodName string) annotation.Annotation {
|
||||
if nil == td.MethodAnnotations {
|
||||
return nil
|
||||
|
|
2
go.mod
2
go.mod
|
@ -3,6 +3,6 @@ module git.loafle.net/loafer/di-go
|
|||
go 1.13
|
||||
|
||||
require (
|
||||
git.loafle.net/loafer/annotation-go v0.0.0-20191113135342-a3974dc21898
|
||||
git.loafle.net/loafer/annotation-go v0.0.0-20191202124147-cb9404f54278
|
||||
git.loafle.net/loafer/util-go v0.0.0-20191113132317-6eeae49d258d
|
||||
)
|
||||
|
|
4
go.sum
4
go.sum
|
@ -1,5 +1,5 @@
|
|||
git.loafle.net/loafer/annotation-go v0.0.0-20191113135342-a3974dc21898 h1:3moCEHhGfzHTQVBde+IkvB42oDGUdpCDkBWjN5ZnoL8=
|
||||
git.loafle.net/loafer/annotation-go v0.0.0-20191113135342-a3974dc21898/go.mod h1:1yow6wwbB3nWq6Asgt3BAPfXJTjZeqgMYF+VVPlj9Xk=
|
||||
git.loafle.net/loafer/annotation-go v0.0.0-20191202124147-cb9404f54278 h1:ncGi8FZ/raFuzqR9689YyLQqM4Tq639c8jL1p4rjtfY=
|
||||
git.loafle.net/loafer/annotation-go v0.0.0-20191202124147-cb9404f54278/go.mod h1:1yow6wwbB3nWq6Asgt3BAPfXJTjZeqgMYF+VVPlj9Xk=
|
||||
git.loafle.net/loafer/util-go v0.0.0-20191112142134-9a567d18b779/go.mod h1:HGVw9FNJIc/UFDIzxmoIj5K2+D9Eadal5jjHOq0NFOU=
|
||||
git.loafle.net/loafer/util-go v0.0.0-20191113132317-6eeae49d258d h1:ESDbDHHzH2Ysq+thQrO/OQtyDkVhzNzshjn0SJIqa0g=
|
||||
git.loafle.net/loafer/util-go v0.0.0-20191113132317-6eeae49d258d/go.mod h1:HGVw9FNJIc/UFDIzxmoIj5K2+D9Eadal5jjHOq0NFOU=
|
||||
|
|
53
registry.go
53
registry.go
|
@ -26,6 +26,8 @@ type Regist interface {
|
|||
GetInstancesByAnnotationType(t reflect.Type) ([]interface{}, error)
|
||||
|
||||
GetTypeAnnotation(instanceType reflect.Type, annotationType reflect.Type) annotation.Annotation
|
||||
GetFieldAnnotation(instanceType reflect.Type, annotationType reflect.Type, methodName string) annotation.Annotation
|
||||
GetFieldAnnotations(instanceType reflect.Type, annotationType reflect.Type) map[string]annotation.Annotation
|
||||
GetMethodAnnotation(instanceType reflect.Type, annotationType reflect.Type, methodName string) annotation.Annotation
|
||||
GetMethodAnnotations(instanceType reflect.Type, annotationType reflect.Type) map[string]annotation.Annotation
|
||||
}
|
||||
|
@ -274,6 +276,30 @@ func (r *Registry) GetTypeAnnotation(instanceType reflect.Type, annotationType r
|
|||
|
||||
return def.GetTypeAnnotationByType(annotationType, false)
|
||||
}
|
||||
func GetFieldAnnotation(instanceType reflect.Type, annotationType reflect.Type, methodName string) annotation.Annotation {
|
||||
return registry.GetFieldAnnotation(instanceType, annotationType, methodName)
|
||||
}
|
||||
func (r *Registry) GetFieldAnnotation(instanceType reflect.Type, annotationType reflect.Type, methodName string) annotation.Annotation {
|
||||
def, ok := r.definitionByType[instanceType]
|
||||
if !ok {
|
||||
return nil
|
||||
}
|
||||
|
||||
return def.GetFieldAnnotationByType(annotationType, methodName)
|
||||
}
|
||||
|
||||
func GetFieldAnnotations(instanceType reflect.Type, annotationType reflect.Type) map[string]annotation.Annotation {
|
||||
return registry.GetFieldAnnotations(instanceType, annotationType)
|
||||
}
|
||||
func (r *Registry) GetFieldAnnotations(instanceType reflect.Type, annotationType reflect.Type) map[string]annotation.Annotation {
|
||||
def, ok := r.definitionByType[instanceType]
|
||||
if !ok {
|
||||
return nil
|
||||
}
|
||||
|
||||
return def.GetFieldAnnotationsByType(annotationType)
|
||||
}
|
||||
|
||||
func GetMethodAnnotation(instanceType reflect.Type, annotationType reflect.Type, methodName string) annotation.Annotation {
|
||||
return registry.GetMethodAnnotation(instanceType, annotationType, methodName)
|
||||
}
|
||||
|
@ -333,9 +359,14 @@ func parseFields(t reflect.Type, td *TypeDefinition) {
|
|||
}
|
||||
parseFields(f.Type, td)
|
||||
} else {
|
||||
if parseMethodAnnotation(&f, td) {
|
||||
if annotation.FieldAnnotationType == f.Type && parseFieldAnnotation(&f, td) {
|
||||
continue
|
||||
}
|
||||
|
||||
if annotation.MethodAnnotationType == f.Type && parseMethodAnnotation(&f, td) {
|
||||
continue
|
||||
}
|
||||
|
||||
as, err := annotation.Parse(f.Tag)
|
||||
if nil != err {
|
||||
return
|
||||
|
@ -384,6 +415,26 @@ func parseTypeAnnotation(f *reflect.StructField, td *TypeDefinition) bool {
|
|||
return false
|
||||
}
|
||||
|
||||
func parseFieldAnnotation(f *reflect.StructField, td *TypeDefinition) bool {
|
||||
if annotation.FieldAnnotationType != f.Type {
|
||||
return false
|
||||
}
|
||||
|
||||
as, err := annotation.Parse(f.Tag)
|
||||
if nil != err {
|
||||
return false
|
||||
}
|
||||
|
||||
if nil != as && 0 < len(as) {
|
||||
if nil == td.FieldAnnotations {
|
||||
td.FieldAnnotations = make(map[string]map[reflect.Type]annotation.Annotation, 0)
|
||||
}
|
||||
td.FieldAnnotations[f.Name[1:]] = as
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func parseMethodAnnotation(f *reflect.StructField, td *TypeDefinition) bool {
|
||||
if annotation.MethodAnnotationType != f.Type {
|
||||
return false
|
||||
|
|
2
types.go
2
types.go
|
@ -24,6 +24,7 @@ var ComponentAnnotationType = reflect.TypeOf((*ComponentAnnotation)(nil))
|
|||
|
||||
type ComponentAnnotation struct {
|
||||
annotation.TypeAnnotation `@annotation:"@Component"`
|
||||
|
||||
Name string `json:"name"`
|
||||
InitMethod string `json:"initMethod"` // func (receiver interface{}, cr ComponentRegistry) error
|
||||
DestroyMethod string `json:"destroyMethod"` // func (receiver interface{}, cr ComponentRegistry) error
|
||||
|
@ -41,5 +42,6 @@ var ResourceAnnotationType = reflect.TypeOf((*ResourceAnnotation)(nil))
|
|||
|
||||
type ResourceAnnotation struct {
|
||||
annotation.TypeAnnotation `@annotation:"@Resource"`
|
||||
|
||||
Name string `json:"name"`
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user