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

标签 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。

最佳答案

无论何时实例化类,它们都不是 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/

相关文章:

java - android - HttpUrlConnection 不起作用

java - 从字符串生成 key (com.google.appengine.api.datastore.Key)

java - Spring Boot 外部配置和 xml 上下文

java - Spring,如何使用 websockets 向连接的客户端广播消息?

hibernate - Spring + hibernate + JPA : How to reload EntityManagerFactory at runtime

spring - 如何让证书进入X509过滤器(Spring Security)?

Java Hibernate 错误 - 类未映射

java - 通过 vb.net 将焦点设置为 webbrowser 内的 java-inputdialog

java - 空白ST : How to find the successor key given a key?

java - 无法向下滚动