我有这个需求,
我的框架的方式是从配置文件中以字符串形式读取类名,我想使用该类中的方法。
显而易见的解决方案是使用反射,
我已经使用了反射并能够调用我想要的方法,但问题是目标类内的变量没有自动装配。我知道我不会让 spring 通过使用反射来自动连接字段(Spring 使用 class.forname() https://stackoverflow.com/questions/6543620/spring-with-class-forname).
有没有办法让我自动装配类变量而不是创建新实例?或者我陷入了僵局?
Option 1: 如果你可以访问当前的 SpringApplicationContext
,您可以按如下方式执行此操作:
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));
}
}
Option 2:您可以手动创建所需类的实例,然后要求 Spring 填充其依赖项。
这再次需要访问ApplicationContext
。例如:
T object = Class.forName(className).newInstance();
applicationContext..getAutowireCapableBeanFactory().autowireBean(object);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)