我正在动态创建包含 spring bean 的类,但是这些 bean 没有被实例化或初始化,将它们保留为空。
如何确保动态创建的类正确创建其所有 spring bean?
这就是我动态创建类的方式:
Class ctransform;
try {
ctransform = Class.forName(strClassName);
Method handleRequestMethod = findHandleRequestMethod(ctransform);
if (handleRequestMethod != null) {
return (Message<?>) handleRequestMethod.invoke(ctransform.newInstance(), message);
}
}
这会将 ctransform 中的所有 spring bean 对象(类型为 strClassName)保留为 null。
每当你实例化类时,它们都是not弹簧管理。 Spring 必须实例化类,以便它可以注入它们的依赖项。当您使用时的情况除外@Configurable
and <context:load-time-weaver/>
,但这更像是一种黑客行为,我建议不要这样做。
Instead:
- 使 bean 成为作用域
prototype
- 获得
ApplicationContext
(在网络应用程序中,这是通过WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext)
)
- 如果类没有注册(我认为它们没有),请尝试转换为
StaticApplicationContext
(我不确定这会起作用),然后打电话registerPrototype(..)
在上下文中注册您的类。如果这不起作用,请使用GenericContext
和它的registerBeanDefinition(..)
- 获取与您的类型匹配的所有实例,使用
appContext.getBeansOfType(yourclass)
;或者如果您刚刚注册并知道其名称 - 只需使用appContext.getBean(name)
- 决定哪一个适用。通常,您的目录中只有一项
Map
,所以使用它。
但我通常会避免对 spring beans 进行反思 - 应该有另一种方法来实现目标。
Update:我只是想到了一个更简单的解决方案,如果您不需要注册 bean,那么该解决方案将起作用 - 即您的动态生成的类不会被注入到任何其他动态生成的类中:
// using WebApplicationContextUtils, for example
ApplicationContext appContext = getApplicationContext();
Object dynamicBeanInstance = createDyamicBeanInstance(); // your method here
appContext.getAutowireCapableBeanFactory().autowireBean(dynamicBeanInsatnce);
并且您将设置依赖项,而无需将新类注册为 bean。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)