使用class.forname但想要自动装配目标类的成员

Kir*_*shi 2 java spring

我有这个要求,

我的框架在某种程度上它从配置文件中读取类名作为字符串,我想在该类中使用方法.

显而易见的解决方案是使用反射,我已经使用了反射并且能够调用我想要的方法,但问题是目标类中的变量不是自动装配的.我知道我不会让spring使用反射(Spring with class.forname())来自动化字段.

有没有办法让我自动装配类变量而不是创建新实例?还是我处于僵局?

man*_*ish 5

选项1:如果您可以访问当前的Spring ApplicationContext,则可以按如下方式执行此操作:

String className = <load class name from configuration>
Class<?> clazz = Class.forName(className);

ApplicationContext applicationContext = <obtain Spring ApplicationContext>
applicationContext.getBean(clazz);
Run Code Online (Sandbox Code Playgroud)

这当然意味着您希望加载其实例的类是Spring托管bean.这是一个具体的例子:

package org.example.beans;

@Component
class Foo { ... }

@Component
class SpringApplicationContext implements ApplicationContextAware {
  private static ApplicationContext CONTEXT;

  @Override
  public void setApplicationContext(final ApplicationContext context) throws BeansException
    CONTEXT = context;
  }

  public static <T> T getBean(String className) {
    return CONTEXT.getBean(Class.forName(className));
  }
}
Run Code Online (Sandbox Code Playgroud)

选项2:您可以手动创建所需类的实例,然后让Spring填充其依赖项.

这又需要访问ApplicationContext.例如:

T object = Class.forName(className).newInstance();

applicationContext..getAutowireCapableBeanFactory().autowireBean(object);
Run Code Online (Sandbox Code Playgroud)