如何在Controller中使用Session Scoped Component

时间:2016-09-14 10:27:18

标签: spring spring-mvc dependency-injection spring-boot spring-ioc

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?

1 个答案:

答案 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