当前位置: 首页 > 知识库问答 >
问题:

每个请求上的Spring自动装配实例总是相同的

邢良才
2023-03-14

我正在使用Spring Bean创建一个实例并自动装配类,并且通过在数据中设置字段从不同的类返回相同的自动装配字段对象。

数据第一次正确地传入,但在第二次REST调用中,每次都会反射相同的对象。我曾尝试使用Scope(“原型”),但这只是第一次有用。如何获得每个请求的正确数据?

@Service
@Scope(value="singleton",proxyMode = ScopedProxyMode.TARGET_CLASS)
public class MessageStats {
    private int count;
    //Setter & Getter
}

@Component
public class Main1 {

    @Autowired
    MessageStats messageStats;

    public MessageStats getStats() {

        // At runtime the data is populated for example: the first time as 10 and second time as 11
        messageStats.setCount(10);
    }

}

@Component
public class Main2 {

    @Autowired
    MessageStats messageStats;

    public MessageStats getStats() {

        // At runtime the data is populated for example: first time as 12 and second time as 13
        messageStats.setCount(12);
    }

 }

输出:

First time
10
12

Second time
10 expected is 11
12 expected is 13

这里的问题是在我的第二个API请求中,messageStats值被持久化,我需要在每次请求时将该值刷新为零,然后我将重新填充数据。

共有3个答案

潘高岑
2023-03-14

原型在每个请求上都创建一个新对象,因此它不保存状态。

龙承德
2023-03-14

如果一个单例bean(即Main1Main2)有一个原型bean作为其依赖项,那么原型bean在创建单例bean时只创建并注入单例bean一次。当单例bean稍后访问原型bean时,它不会创建另一个新的原型bean。这种行为在留档中得到了很好的解释。

如果您想在单例bean访问原型bean时创建一个新的原型实例,那么有很多选项。

例如,我会使用:

public class Main1{

     @Autowired
     Provider<MessageStats> messageStats;

     public MessageStats getStats(){
        messageStats.get().setCount(10);
     }
 }
锺离慈
2023-03-14

不要使用范围(“原型”)而使用范围(“单例”)https://www.baeldung.com/spring-bean-scopes

 类似资料:
  • 问题内容: 我有一个包装连接池的类,该类从spring配置中获取其连接详细信息,如下所示: 此bean稍后在服务中使用,并与注释自动关联。 我的问题是,我该如何复制该bean并为其提供不同的连接详细信息,然后在服务中添加它。意思除了上面,我将有: 并在服务中: 问题答案: 您可以与结合使用,但在这种情况下,我建议使用: 甚至更简单:

  • 本文向大家介绍Spring 自动装配的二义性实例解析,包括了Spring 自动装配的二义性实例解析的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Spring 自动装配的二义性实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.我们知道可以用Spring的自动装配(@Autowired)将Bean应用注入到构造参数和属性中,但

  • 问题内容: 每个HTTP请求是否在不同的线程中访问相同的servlet对象?还是创建一个新的线程和新的Servlet实例? 问题答案: 如果您的servlet未实现,则容器将使用相同的servlet实例。否则,不能保证击中相同的物体。如果认为必要,容器可以自由创建更多的servlet实例。但是请求来自不同的线程,不一定是新创建的(如Sanjay所述)。 根据Servlet 3.0规范: 对于未在分

  • Spring支持IOC,自动装配不用类实例化,直接从bean容器中取。 1、配置在xml中 <bean id="employeeDAO" class="com.guor.EmployeeDAOImpl" autowire="byName" /> 2、@Autowired自动装配

  • 本文向大家介绍Spring装配bean方法实例总结,包括了Spring装配bean方法实例总结的使用技巧和注意事项,需要的朋友参考一下 一 前言 在XML中进行显式配置。 在Java中进行显式配置。 隐式的bean发现机制和自动装配 关于xml配置不会在本篇说明,有兴趣的读者可以自行了解学习; 二 自动装配bean 自动装配Bean主要通过如下两个方式实现自动装备bean 组件扫描(compone

  • 我在项目中使用drools 6.3.0。我有大约3000条规则,分为两类。比如,类别1有1500条规则,类别2有1500条规则。有2万份订单具有不同的数据。每个订单都有一组不同的属性。现在,为每个请求创建kiesession需要时间,而且速度非常慢。因此,计划使用相同的kiesession执行所有订单,订单将使用多线程处理。 以下是我目前的做法。 这就是我创建kiesession的方式,我想将此k