如何在运行时使用bean定义对象生成/创建新的spring bean?

时间:2017-06-18 20:25:10

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

我是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>

1 个答案:

答案 0 :(得分:0)

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

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

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