【问题标题】:How can I generate/create new spring beans at runtime with a bean definition object?如何在运行时使用 bean 定义对象生成/创建新的 spring bean?
【发布时间】:2017-06-18 20:25:10
【问题描述】:

我是 Spring 新手,我想为模板 bean 编写一个 beanGenerator。我想使用这个生成器来克服线程安全问题。谁能帮我添加/修改代码以使其工作?描述我真正的问题有点困难,所以我将问题抽象为以下代码:

abstract class BeanDefinition {

  abstract public void preprocess();

}

// now we have 1st user specific bean :
class UserSpecifiedBeanDefinition extends BeanDefinition{

  @override
  public void preprocess() {
     // do something
  }

}


// we could have more user-specific beans that extend BeanDefinition
....




// Following generator class is used to generate beans

public class BeanGenerator {

  private BeanDefinition beanDefinition;
  public BeanGenerator(BeanDefinition beanDefinition) {
    this.beanDefinition = beanDefinition;
  }
  public generate() {
    BeanDefinition newBean = // create new bean based on beanDefinition? how can I make this work??
    newBean.preprocess();
    return newBean;
  }
}

// In spring.xml, I would like to use them like:
<bean id="generator1" class="com.xxx.xxx.BeanGenerator">
    <constructor-arg name="beanDefinition" ref="userSpecifiedBeanDefinition"/>
</bean>

【问题讨论】:

  • 你看过范围原型的bean吗?
  • @Thierry 是的,但我还没有想到在这种情况下使用原型范围的方法。你能多指点一下吗?在这种情况下,我有一个抽象的bean定义,以后用户会定义自己的具体bean定义,生成器会根据不同的具体定义生成bean。

标签: java spring inversion-of-control generator javabeans


【解决方案1】:

我想你有一个没有参数的构造函数。使用反射实例化类

Class c = BeanGenerator.class.getClassLoader().loadClass(beanDefinition.getBeanClassName());
Constructor con = c.getConstructor();
Object instance = con.newInstance();

如果您有带参数的构造函数,则应更改逻辑以选择正确的构造函数并将参数传递给newInstance() 调用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 2016-03-18
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    相关资源
    最近更新 更多