-
Notifications
You must be signed in to change notification settings - Fork 0
/
Aspect.go
65 lines (54 loc) · 1.54 KB
/
Aspect.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package Panizza
import (
"log"
"strings"
"sync"
"container/list"
"reflect"
)
//全局存放注册的Aspect
var Aspecters = sync.Map{}
type Aspect interface {
Config() string //配置切面 return "xxxxx|xxxxx|xxxxx" xxxxx表示需要配置的目标函数名称
Before(ctx *HandleContext, HandleName string) //目标方法执行之前执行
After(ctx *HandleContext, HandleName string) //目标方法执行之后执行
AfterPanic(err interface{}, ctx *HandleContext, HandleName string) //目标方法出现异常后执行
}
//传入Aspect指针,注册Aspect
func RegistAspecter(aspect interface{}) {
t := reflect.TypeOf(aspect)
v := reflect.ValueOf(aspect)
for i := 0; i < v.NumMethod(); i++ {
name := t.Method(i).Name
if name == "OnCreate" {
v.Method(i).Call([]reflect.Value{})
continue
}
}
handleNamesString := (aspect.(Aspect)).Config()
if handleNamesString == "" {
return
}
log.Println("Aspect at HandleName:", handleNamesString)
handleNamesSlice := strings.Split(handleNamesString, "|")
m := map[string]*list.List{}
for key, val := range controllerInstence.methodTree {
li := val
for _, name := range handleNamesSlice {
for e := li.Front(); e != nil; e = e.Next(){
n := e.Value.(*node)
if n.HandleName == name{
n.HasAspect = true
e.Value = n
}
}
}
m[key] = li
}
for k, v := range m {
controllerInstence.methodTree[k] = v
}
for _, v := range handleNamesSlice {
Aspecters.Store(v, aspect)
}
}