我正在动态创建包含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。
答案 0 :(得分:10)
每当您实例化类时,它们都不是不是弹簧管理的。 Spring必须实例化类,以便它可以注入它们的依赖项。除了使用@Configurable
和<context:load-time-weaver/>
之外的情况除外,但这更像是黑客攻击而且我建议反对它。
相反:
prototype
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" );