在动态创建的类中实例化spring bean

时间:2010-05-19 17:47:41

标签: java spring

我正在动态创建包含spring bean的类,但是bean没有被实例化或初始化,而是将它们保留为null。

如何确保动态创建的类正确创建其所有的spring bean?

这就是我动态创建类的方法:

Class ctransform;
try {
    ctransform = Class.forName(strClassName);
    Method handleRequestMethod = findHandleRequestMethod(ctransform);
    if (handleRequestMethod != null) {
        return (Message<?>) handleRequestMethod.invoke(ctransform.newInstance(), message);
            }
    }

这使得ctransform(strClassName类型)中的所有spring bean对象都为null。

2 个答案:

答案 0 :(得分:10)

每当您实例化类时,它们都不是不是弹簧管理的。 Spring必须实例化类,以便它可以注入它们的依赖项。除了使用@Configurable<context:load-time-weaver/>之外的情况除外,但这更像是黑客攻击而且我建议反对它。

相反:

  • 制作范围prototype
  • 的bean
  • 获取ApplicationContext(在网络应用中通过WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext)完成)
  • 如果这些类没有注册(我认为它们没有注册),请尝试转换为StaticApplicationContext(我不确定这是否可行),并调用registerPrototype(..)注册您的课程上下文。如果这不起作用,请使用GenericContext及其registerBeanDefinition(..)
  • 使用appContext.getBeansOfType(yourclass)获取与您的类型匹配的所有实例;或者如果您刚刚注册并知道其名称 - 只使用appContext.getBean(name)
  • 决定哪一个适用。通常,Map中只有一个条目,因此请使用它。

但我通常会避免反思春豆 - 应该有另一种方法来实现目标。


更新:我只是想到了一个更简单的解决方案,如果您不需要注册bean,那将会有效 - 即您的动态生成的类不会被动态生成的任何其他类型注入类:

// using WebApplicationContextUtils, for example
ApplicationContext appContext = getApplicationContext(); 
Object dynamicBeanInstance = createDyamicBeanInstance(); // your method here
appContext.getAutowireCapableBeanFactory().autowireBean(dynamicBeanInsatnce);

您将设置依赖项,而不必将新类注册为bean。

答案 1 :(得分:0)

您需要Spring容器来实例化类,而不是使用反射来实例化。要使bean作用于原型,请使用以下语法:

<bean id="prototypeBean" class="xyz.PrototypeBean" scope="prototype">
  <!-- inject dependencies here as required -->
</bean>

然后使用以下代码实例化原型bean:

ApplicationContext applicationContext = new ClassPathXmlApplicationContext ( "applicationContext.xml" );

PrototypeBean prototypeBean = ( PrototypeBean ) applicationContext.getBean ( "prototypeBean" );