【问题标题】:Working of Spring Bean in the following code - How are the Bean properties saved/managed?以下代码中 Spring Bean 的工作 - 如何保存/管理 Bean 属性?
【发布时间】:2025-12-19 10:40:11
【问题描述】:

我正在尝试根据一个流行的教程在 Spring Security 中实现用户日志记录,并且对 Spring bean 的连接方式有疑问。

下面的类被定义为 Spring Context 中的标准 bean

public class ActiveUserStore {

    public List<String> users;

    public ActiveUserStore() {
        users = new ArrayList<String>();
    }

    public List<String> getUsers() {
        return users;
    }

    public void setUsers(List<String> users) {
        this.users = users;
    }
}

以上定义为一个Bean通过

@Bean
public ActiveUserStore activeUserStore(){
    return new ActiveUserStore();
}

并且 Bean 正在下面的类中使用,请注意 users.add(user.getUsername());

@Component
public class LoggedUser implements HttpSessionBindingListener {

private String username; 
private ActiveUserStore activeUserStore;

public LoggedUser(String username, ActiveUserStore activeUserStore) {
    this.username = username;
    this.activeUserStore = activeUserStore;
}

public LoggedUser() {}

@Override
public void valueBound(HttpSessionBindingEvent event) {
    List<String> users = activeUserStore.getUsers();
    LoggedUser user = (LoggedUser) event.getValue();
    if (!users.contains(user.getUsername())) {
        users.add(user.getUsername());//HOW IS THIS SAVED TO THE ACTIVEUSERSTORE BEAN
    }
}

@Override
public void valueUnbound(HttpSessionBindingEvent event) {
    List<String> users = activeUserStore.getUsers();
    LoggedUser user = (LoggedUser) event.getValue();
    if (users.contains(user.getUsername())) {
        users.remove(user.getUsername());//HOW IS THIS SAVED TO THE ACTIVEUSERSTORE BEAN
    }
}

我的问题:既然 users 变量属于 ActiveUserStore Bean,那么 Logged User Class 的 valueBound 和 valueUnbound 方法中的下面这行代码如何自动将用户数据保存在 ActiveUserStore Bean 中?

users.add(user.getUsername());

为了清楚起见,我还在上面的代码中标记了这一行。

感谢任何帮助,因为我认为我对 Beans 如何连接和使用的理解可能不清楚,因为我无法理解上述工作。谢谢。

【问题讨论】:

    标签: java spring spring-mvc spring-boot javabeans


    【解决方案1】:

    将 Spring Bean 视为通常的 Java 类。这个类在应用程序启动时由 Spring 实例化一次(实际上并不总是如此,但默认情况下是这样)

    现在你在你的 bean 里面,你已经引用了 List 变量并得到它:

    List<String> users = activeUserStore.getUsers();
    

    现在 users 变量包含对存储在 bean 中的 List 的引用。这是因为在 Java 中对象是通过引用传递的。

    LoggedUser user = (LoggedUser) event.getValue();
    if (!users.contains(user.getUsername())) {
    

    这里 users 变量包含 List 类引用。 List 类有 add 方法,LoggedUser 有 getUsername 方法。由于 users 变量 引用 与您的 bean 属性包含相同的 List 对象,这会将用户名添加到您的 bean:

        users.add(user.getUsername());
    }
    

    【讨论】:

    • “由于 users 变量引用了与您的 bean 属性相同的 List 对象” - 请您解释一下 - 我们如何得出这个结论?
    • 这是java特性。 Java 通过引用传递对象。如果这有帮助,请告诉我。
    • 是的,但是还有一个用户对象是通过 --- List users = activeUserStore.getUsers() 创建的。现在,这个用户如何被保存到 bean 属性中。
    • 您在这里弄错了:“用户对象已创建”。它不是创建的。 users 变量引用了 bean 中使用的同一个对象。所以实际上用户已经填充了对象。在应用程序开始时在 ActiveUserStore bean 构造函数中创建的用户中存储的对象: users = new ArrayList();