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

Spring bean如何使用原型范围?

屠君墨
2023-03-14
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE, proxyMode = 
ScopedProxyMode.TARGET_CLASS)
public class SimpleBean {
    private String id;
    private Long value;
    public String getId() {
       return id;
    }

    public void setId(String id) {
       this.id = id;
    }

    public Long getValue() {
        return value;
    }

    public void setValue(Long value) {
        this.value = value;
    }
}
@Component
public class AppRunner {

    @Autowired
    SimpleBean simpleBean;

    public void execute(List<Output> results){
        List<SimpleBean> finalResults = new ArrayList<SimpleBean>();
        for(Output o : results){
            simpleBean.setId(o.getAppId());
            simpleBean.setValue(o.getAppVal());
            finalResults.add(simpleBean);
        }
    }
}

output.java

public class Output {
    private String appId;
    private Long appVal;

    public String getAppId() {
        return appId;
    }

    public void setAppId(String appId) {
        this.appId = appId;
    }

    public Long getAppVal() {
        return appVal;
    }

    public void setAppVal(Long appVal) {
        this.appVal = appVal;
    }
}

共有1个答案

左翰海
2023-03-14

不幸的是,原型范围不像这样工作。当您的apprunnerbean被容器实例化时,它会请求它的依赖项。然后创建SimpleBean的新实例。此实例作为依赖项保留。当您将有多个依赖于SimpleBean的bean时,Prototype作用域开始工作。比如:

@Component
class BeanOne {
    @Autowired
    SimpleBean bean; //will have its own instance
}

@Component
class BeanTwo {
    @Autowired
    SimpleBean bean; //another instance
}

有一个相当直接的更新,可以导致你想要的行为。您可以移除autowired依赖项,并从上下文中请求循环中的新依赖项。会是这样的。

@Component
public class AppRunner {

    @Autowired
    ApplicationContext context;

    public void execute(List<Output> results){
        List<SimpleBean> finalResults = new ArrayList<SimpleBean>();
        for(Output o : results) {
            SimpleBean simpleBean = context.getBean(SimpleBean.class);
            simpleBean.setId(o.getAppId());
            simpleBean.setValue(o.getAppVal());
            finalResults.add(simpleBean);
        }
    }
}

其他选项可以是名为方法注入的技术。在原型范围的相关文档中对其进行了描述。您可以在这里查看具有原型bean依赖关系的7.5.3单例bean

 类似资料:
  • 我正在使用 Spring 3.1.1,在我的业务逻辑中,我有一个循环,每次迭代都需要一个新的 Spring bean(原型范围)实例。 最好的方法是什么?我是否必须创建自己的 BeanFactory 类,我可以将其注入一次到我的类中,并且每次都调用它来生成 bean?在查看 Spring 3 文档时,它似乎暗示我应该改用 ApplicationContext。但是,使用ApplicationCon

  • 我目前正在构建一个python gRPC服务器,它将大量不同的proto消息序列化为json,以将它们存储到无sql数据库中。我希望简化此服务器的扩展,这样我们就可以添加新类型,而无需重写gRPC服务器和重新部署。理想情况下,我们希望定义一条新消息,将其放入一个proto文件中,并仅更新客户端。服务器首先应该期望任何类型,但知道。进行序列化/反序列化时要查找的原型文件或文件夹。 我读过关于“任何类

  • 如何在原型范围bean上应用spring aop方面 但令人惊讶的是,在调用原型bean的joinpoint方法时,方面并没有执行。我确信我创建的切入点是正确的,因为在eclipse中,aspectJ插件在joinPoint方法上显示了aspectJ引用的可视化标记,这表明切入点是正确的,但不确定为什么在运行时调用PrototypeBean的joinPoint方法时没有执行它。 我是以不正确的方式

  • 问题内容: 我有一个名为Bar的类,带有以下注释: 在私人成员上,我具有以下注释: 在春季配置中,我有一个Foo类的bean。如果用它定义的bean 不起作用,则出现以下异常: NoSuchBeanDefinitionException:找不到依赖项为Foo的匹配bean:期望至少有1个有资格作为此依赖项的自动装配候选的bean 一旦我将注入的bean作用域更改为正常工作。 是否自动布线原型作用域

  • 问题内容: 使用Spring的Java Config,我需要使用只能在运行时获得的构造函数参数来获取/实例化作用域原型的bean。考虑以下代码示例(为简便起见,已简化): Thing类的定义如下: 注意事项name是final:它只能通过构造函数来提供,并保证不变性。其他依赖关系是Thing类的特定于实现的依赖关系,不应知道(紧密耦合到)请求处理程序实现。 这段代码与Spring XML配置完美配

  • 问题内容: 我想了解何时在js中使用原型方法。应该一直使用它们吗?还是在某些情况下不优选使用它们和/或导致性能下降? 在此站点上搜索js中命名空间的常用方法时,似乎大多数人都使用了基于非原型的实现:简单地使用对象或函数对象来封装名称空间。 来自基于类的语言,很难不尝试绘制相似之处,并认为原型就像“类”,而我提到的命名空间实现就像静态方法。 问题答案: 原型是一种 优化 。 很好地使用它们的一个很好