我有一个类的层次结构,可以生成一些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?
答案 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。