java - 每次调用其方法时都会重新创建 CGlib-wired bean

标签 java spring inversion-of-control cglib

我正在观察原型(prototype)范围的类代理 Spring bean 的一些奇怪行为。我正在使用 Spring 4.1.2。

我手动创建一个 bean,然后调用它的方法 3 次。每次方法调用时都会创建一个新的类实例 - 下面的代码会打印一个新的 ID。这意味着我无法可靠地将状态存储在 bean 内。

预期: 该类的单个实例。

观察: 每个 bean 方法调用都会导致新的类实例创建。

我深入研究了 CGlib - 它为每个方法调用从 bean 工厂获取目标 Spring bean。 Spring bean 工厂每次都会愉快地创建一个新 bean(因为它是原型(prototype) bean)。

这是预期行为还是错误?

@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class BeanClass1 extends SomeAbstractClass implements I1, I2 {
     public void tellMe() {
        System.out.println(this);
    }
}

BeanClass1 bean = beanFactory.getBean(BeanClass1.class);
bean.tellMe();
bean.tellMe();
bean.tellMe();

最佳答案

我已经切换到 JDK 代理,它们不会在每个 bean 方法调用上重新创建 bean。

该 bean 现在带有注释

@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)

关于java - 每次调用其方法时都会重新创建 CGlib-wired bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26903844/

相关文章:

c# - 单元测试依赖注入(inject)

java - 如何解决图书馆的密封违规问题?密封违规 : package org. lwjgl.opengl 被密封

java - 帮助在 Java 中制作单链表

java - spring-boot-starter-data-jpa 依赖错误

c# - 如何在温莎城堡中自动注册(按照惯例)通用装饰器

dependency-injection - 为什么不使用 IoC 容器来解决实体/业务对象的依赖关系?

java - 如何在 Hibernate 属性文件中启用 infinispan 缓存?

java - 使用 JPA CriteriaBuilder 生成查询,其中属性位于列表中或为空

java - 如何修复创建名为 'requestMappingHandlerAdapter' 的 bean 时出错

Spring Data REST URI 与实体 ID