我有这个要求,
我的框架在某种程度上它从配置文件中读取类名作为字符串,我想在该类中使用方法.
显而易见的解决方案是使用反射,我已经使用了反射并且能够调用我想要的方法,但问题是目标类中的变量不是自动装配的.我知道我不会让spring使用反射(Spring with class.forname())来自动化字段.
有没有办法让我自动装配类变量而不是创建新实例?还是我处于僵局?
选项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)
| 归档时间: |
|
| 查看次数: |
3820 次 |
| 最近记录: |