Count.java:
package main
import (
"fmt"
"reflect"
)
func main() {
bs := []B{B{A{"BC1", "BN"}, "e"}, B{A{"BC2", "BN"}, "e"}}
strs := BankCodes(bs)
fmt.Println(strs)
as := []A{A{"AC1", "BN"}, A{"AC2", "BN"}}
strs2 := BankCodes(as)
fmt.Println(strs2)
}
func BankCodes(data interface{}) []string {
if reflect.TypeOf(data).Kind() != reflect.Slice {
panic("err: data is not slice")
}
slice := reflect.Indirect(reflect.ValueOf(data))
res := make([]string, slice.Len())
for i := 0; i < slice.Len(); i++ {
a := slice.Index(i).Interface().(BankCoder)
res[i] = a.Bankcode()
}
return res
}
type A struct {
BankCode string `json:"bankCode"`
BankName string `json:"bankName"`
}
type B struct {
A
extra string `json:" extra"`
}
type BankCoder interface {
Bankcode() string
}
func (a A) Bankcode() string {
return a.BankCode
}
控制器:
@Component
@Scope(value = "session",proxyMode = ScopedProxyMode.TARGET_CLASS)
public class Count {
Integer i;
public Count() {
this.i = 0;
}
但是每次我运行这个控制器(/问候语)时,即使关闭浏览器,它总是会增加i,所以如何在Singleton Controller中使用这个Session Scoped Component?
答案 0 :(得分:9)
代理只拦截方法调用。在您的情况下,会发生以下情况:
@Autowired private Count count;
创建一个看起来像count实例的代理,因此也有一个i
字段。但由于代理不是真实的,因此Count
构造函数未被调用,i
仍然未初始化。这就是为什么你总是得到null
。
现在让我们介绍一个吸气剂:
class Count {
...
public Integer getI() {
return i;
}
当您调用getI()
时,代理首先检查当前会话是否存在Count
bean的实例。如果没有,则创建一个。这也意味着调用Count
构造函数,i
现在已经初始化。然后代理将调用委托给将返回getI()
值的bean i
。