弹簧和动态对象创建

时间:2013-08-30 18:58:50

标签: spring

我有一个类的层次结构,可以生成一些PDF发票。基本上所有类都实现了一个接口,该接口具有生成发票所需的所有方法 问题是需要实例化的具体类是在运行时确定的,因为每个客户端的类名都存储在数据库中。
现在我有类似的东西:

    String pdfProcessorClass = "PdfParserXXX";
    pdfProcessorClass = pdfProcessorClass.trim();
    Invoic2Pdf pdfGenerator;
    try {
            Class<?> forName = Class.forName(pdfProcessorClass);
            pdfGenerator= (Invoic2Pdf) forName.newInstance();
            pdfGenerator.init(xXx, yYy);

        } catch (Exception e) {
          //deal with exception
        }

是否有可能使用Spring IoC以更优雅的方式实现这一点,考虑到需要动态创建的这些类本身就是spring bean?

1 个答案:

答案 0 :(得分:1)

Spring的IoC功能主要来自BeanFactory界面。

此接口及其任何实现(AFAIK)都没有任何方法可以从String类名创建bean。因此,您必须解析并使用Class.forName(String)来获取Class实例。

一旦拥有该类,就可以使用Spring创建bean。

Class<?> forName = Class.forName(pdfProcessorClass);
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("yourContext.xml");
pdfGenerator = context.getBeanFactory().createBean(forName);

或重载的createBean()方法。有关详细信息,请查看here