当前位置: 首页 > 面试题库 >

Spring原型原型中的bean

白青青
2023-03-14
问题内容

我试图将一个prototypebean 注入一个bean中singleton,以便对单例bean方法的每个新调用都具有原型bean的新实例。

考虑如下的单例豆:

    @Component
    public class SingletonBean {
       @Autowired 
       private PrototypeBean prototypeBean;

       public void doSomething() {
         prototypeBean.setX(1);
         prototypeBean.display();
       }
    }

我希望每次doSomething()调用该方法时,PrototypeBean都会使用一个新实例。

下面是原型bean:

     @Component 
     @Scope(value="prototype", proxyMode = ScopedProxyMode.TARGET_CLASS)
     public class PrototypeBean {
        Integer x;

        void setX(Integer x) {
         this.x = x;
        }

        void display() {
          System.out.println(x);
        }
    }

似乎正在发生的事情是,Spring急于在该doSomething()方法中交付PrototypeBean的新实例。也就是说,该doSomething()方法中的两行代码将在每一行中创建一个prototypeBean的新实例

因此,在第二行中,prototypeBean.display()输出 NULL

此注入的配置缺少什么?


问题答案:

从Spring 文档中:

您不需要将<aop:scoped- proxy/>结合用于范围为单例或原型的bean。如果尝试为单例bean创建作用域代理,则会引发BeanCreationException。

对于3.2版文档,文档似乎有所更改,您可以在此处找到以下句子:

您不需要将<aop:scoped-proxy/>结合用于范围为单例或原型的bean。

似乎不希望您使用代理原型Bean,因为每次请求Bean BeanFactory都会创建它的新实例。

为了为原型bean提供一种工厂,您可以使用ObjectFactory以下方法:

@Component
public class SingletonBean {

    @Autowired
    private ObjectFactory<PrototypeBean> prototypeFactory;

    public void doSomething() {
        PrototypeBean prototypeBean = prototypeFactory.getObject();
        prototypeBean.setX(1);
        prototypeBean.display();
    }
}

并且原型bean将声明如下:

@Component 
@Scope(value="prototype")
public class PrototypeBean {
    // ...
}


 类似资料:
  • 本文向大家介绍全面解析js中的原型,原型对象,原型链,包括了全面解析js中的原型,原型对象,原型链的使用技巧和注意事项,需要的朋友参考一下 理解原型 我们创建的每一个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。看如下例子: 理解原型对象 根据上面代码,看下图: 需要理解三点: 我们只要创建了一个新的函

  • "prototype" 属性在 JavaScript 自身的核心部分中被广泛地应用。所有的内置构造函数都用到了它。 首先,我们将看看原生原型的详细信息,然后学习如何使用它为内建对象添加新功能。 Object.prototype 假如我们输出一个空对象: let obj = {}; alert( obj ); // "[object Object]" ? 生成字符串 "[object Object]

  • 原型链是一种机制,指的是 JavaScript 每个对象都有一个内置的 __proto__ 属性指向创建它的构造函数的 prototype(原型)属性。原型链的作用是为了实现对象的继承,要理解原型链,需要先从函数对象、constructor、new、prototype、__proto__ 这五个概念入手。 函数对象 前面讲过,在 JavaScript 里,函数即对象,程序可以随意操控它们。比如,可

  • Spring具有bean类型/作用域,如 -singleton bean(每个应用程序上下文只有一个bean), -prototype bean(每个请求一个新bean) 现在,如果在单例bean中有对原型bean的引用,是否有办法在对单例bean的每个请求中获得一个新的原型bean(在单例bean中)。< br >如果是,配置会是什么样的?

  • 前言 JavaScript 不包含传统的类继承模型,而是使用 prototypal 原型模型。 虽然这经常被当作是 JavaScript 的缺点被提及,其实基于原型的继承模型比传统的类继承还要强大。实现传统的类继承模型是很简单,但是实现 JavaScript 中的原型继承则要困难的多。 由于 JavaScript 是唯一一个被广泛使用的基于原型继承的语言,所以理解两种继承模式的差异是需要一定时间的

  • 了解如何在 XD 中使用原型。 使用 Adobe XD,设计师和审阅者可以轻松地协作处理共享原型。作为审阅者,您可以通过以下方式使用原型: 与原型交互 使用原型进行导航 添加评论 使用原型需要满足哪些先决条件? 审阅者必须先使用 Adobe ID 登录,然后才能评论原型。如果您是企业用户,请联系帐户管理员来获取权限和凭证。 如需以访客身份登录,请单击评论面板底部的“以访客身份登录”。当系统提示您提