先上最终效果,一段测试代码:
package wind
import (
"testing"
"reflect"
"fmt"
)
type Person struct {
Name string `@:"Autowired"`
}
func (p *Person) hello() {
fmt.Println("Hello,", p.Name)
}
func TestWind(t *testing.T) {
_type := reflect.TypeOf(Person{})
bf := CreateBeanFactory()
err := bf.RegisterBean(_type)
if err != nil {
fmt.Println(err)
} else if bean, ok := bf.GetBean("Person"); ok {
if p, ok := bean.(Person); ok {
p.hello()
}
}
}
根据上面的代码,可以知道我们自动装配的流程如下:
- 创建BeanFactory
- 获取Person的反射类型,并将其注册到BeanFactory中
- 根据名字获取Bean实例
首先定义BeanFactory和Bean
type Bean struct {
Name string
beanType reflect.Type
}
type BeanFactory struct {
beans map[string]Bean
}
这两个定义很简单,BeanFactory使用一个map存储所以注册的Bean
顺带实现CreateBeanFact