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

如何在Grails中获取原型bean的实例?

年嘉禧
2023-03-14

在Spring中,如果我定义了一个原型bean,我可以在Spring Framework4.3.0.Release的当前时间使用查找方法注入来注入它。

在Grails中,如何在运行时注入原型bean?Grails 2.5.4文档展示了如何设置bean.scope='prototype“bean.singleton=false,但实际上并没有给出如何注入非单件bean的示例。

共有1个答案

蔡鹏程
2023-03-14

我在Grails中没有看到原型作用域bean的太多使用,我看到的使用的是Spring文档中描述的模式,它直接与ApplicationContext一起工作。我假设您可以在Grails中使用与Spring中相同的方法注入方法,但这里有一个简单的工厂类,它不涉及CGLIB子类,但在其他方面是类似的。它确实从ApplicationContext检索一个原型实例,但它隐藏在实现中,不会使应用程序代码混乱:

package com.yourcompany

import groovy.transform.CompileStatic
import org.springframework.context.ApplicationContext
import org.springframework.context.ApplicationContextAware

@CompileStatic
class PrototypeFactory<T> implements ApplicationContextAware {

   ApplicationContext applicationContext
   final Class<T> beanClass
   final String beanName

   PrototypeFactory(Class<T> beanClass, String beanName) {
      this.beanClass = beanClass
      this.beanName = beanName
   }

   T getInstance() {
      applicationContext.getBean(beanName, beanClass)
   }
}

要使用它,请为类注册一个bean,提供原型bean的bean名称和bean类(在resources.groovy或插件的doWithSpring中):

beans = {
   cartFactory(PrototypeFactory, ShoppingCart, 'shoppingCart')
}

现在,您可以注入工厂bean并调用getInstance(),它将返回一个新的原型实例,由于它使用的是泛型,因此不需要任何转换:

class SomeClass {
   PrototypeFactory<ShoppingCart> cartFactory
   ...

   def someMethod() {
      ShoppingCart newCart = cartFactory.instance
      ...
   }
}

您可以重用factory类为各种原型bean注册您想要的数量,只要它们具有唯一的bean名称。

没有一个名称是重要的,因此将getInstance()更改为您喜欢的任何名称,并将'Factory'更改为'Manager'或其他名称。

 类似资料:
  • 我使用和注释来注入一个原型bean。 然而,注入bean的行为类似于单例bean。有没有办法在mockito中注入一个原型范围bean? 我正在使用运行JUnit,并使用运行初始化模拟。

  • 问题内容: 我试图将一个bean 注入一个bean中,以便对单例bean方法的每个新调用都具有原型bean的新实例。 考虑如下的单例豆: 我希望每次调用该方法时,都会使用一个新实例。 下面是原型bean: 似乎正在发生的事情是,Spring急于在该方法中交付PrototypeBean的新实例。也就是说,该方法中的两行代码将在每一行中创建一个prototypeBean的新实例。 因此,在第二行中,输

  • 我需要能够创建新的bean实例——不是像在< code>proxyMode=*中那样在每次调用方法时创建,而是仅在需要时创建(例如,调用< code >)。getObject())。 我知道有,但问题是我不能在java配置中定义工厂,而必须在bean中使用硬编码字符串。所以这就是我想实现的目标:

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

  • 问题内容: 我在Spring上下文中有几个具有状态的bean,所以我想在单元测试之前/之后重置该状态。 我的想法是向助手类添加一个方法,该方法仅遍历Spring上下文中的所有bean,检查用或注释的方法并调用它们。 如何从中获取实例化的 bean 列表? 注意:仅迭代所有定义的bean的解决方案是没有用的,因为我有很多惰性bean,并且其中一些不能被实例化,因为这在某些测试中会失败(即,我有一个需

  • 如何获得原始json输出。如果可能的话,我不想实现用户数据类和解析器。有什么办法吗? 标记重复的帖子(获得原始HTTP响应与改造)不是为Kotlin和我需要Kotlin版本。