gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 01:30:20 25 4
gpt4 key购买 nike

我正在动态创建包含 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。

最佳答案

无论何时实例化类,它们都不是 spring 管理的。 Spring 必须实例化类,以便它可以注入(inject)它们的依赖项。使用 @Configurable 时除外。和 <context:load-time-weaver/> ,但这更像是一种 hack,我建议不要这样做。

相反:

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

但我通常会避免对 spring beans 进行反射(reflection) - 应该有另一种方法来实现目标。


更新:我只是想到了一个更简单的解决方案,如果您不需要注册 bean,它就可以工作——也就是说,您的动态生成的类不会被注入(inject)到任何其他动态生成的类中类:

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

并且您将设置依赖项,而无需将新类注册为 bean。

关于java - 在动态创建的类中实例化 spring bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2867997/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com