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

时间:2016-06-27 03:38:10

标签: spring grails singleton

在Spring中,如果我定义了一个原型bean,我可以在Spring Framework 4.3.0.RELEASE的当前时间使用lookup method injection注入它。

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

1 个答案:

答案 0 :(得分:2)

我没有在Grails中看到过使用原型范围bean,我所看到的使用Spring文档中描述的模式,该模式直接与ApplicationContext一起使用。我假设您可以在Spring中使用与Grails中相同的方法注入方法,但这里是一个简单的工厂类,它不涉及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
      ...
   }
}

只要具有唯一的bean名称,您就可以重用工厂类来为各种原型bean注册尽可能多的原型bean。

所有名称都不重要,因此将getInstance()更改为您喜欢的名称,并将“工厂”更改为“经理”或其他任何名称。