gpt4 book ai didi

java - 使用 class.forname 但想要 Autowiring 目标类的成员

转载 作者:行者123 更新时间:2023-12-03 02:58:27 25 4
gpt4 key购买 nike

我有这个要求,

我的框架以字符串形式从配置文件中读取类名,我想使用该类中的方法。

显而易见的解决方案是使用反射,我已经使用了反射并且能够调用我想要的方法,但问题是目标类内的变量没有 Autowiring 。我知道我不会让 spring 通过使用反射( Spring with class.forname() )来 Autowiring 字段。

有没有办法让我 Autowiring 类变量而不是创建新实例?或者我陷入了僵局?

最佳答案

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

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

ApplicationContext applicationContext = <obtain Spring ApplicationContext>
applicationContext.getBean(clazz);

这当然意味着您希望加载其实例的类是 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));
}
}
<小时/>

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

这再次需要访问ApplicationContext。例如:

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

applicationContext..getAutowireCapableBeanFactory().autowireBean(object);

关于java - 使用 class.forname 但想要 Autowiring 目标类的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31237062/

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