我正在研究一个需要在运行时创建spring bean的模块。我的驱动程序应用程序是一个Spring启动应用程序,它需要创建一个bean(它位于应用程序的组件扫描包之外)并调用该bean中的方法。完全限定的类名和方法名称将是运行时参数。以下是一个例子:
要创建的Bean:
@Component
@ComponentScan(basePackages = {"com.test"})
public class TestClass {
@Autowired
private AnotherTestClass anotherTest;
public void test(){
System.out.println("In test");
anotherTest.test();
}
}
这是驱动程序类代码(显然不起作用):
public void test(){
try{
Class testClass = Class.forName("com.test.TestClass");
Object newInstance = testClass.newInstance();
applicationContext.getAutowireCapableBeanFactory().autowireBean(newInstance);
Method testMetod = testClass.getMethod("test");
testMetod.invoke(newInstance, null);
}catch(Exception e){
e.printStackTrace();
}
}
这里,applicationContext是自动装配的。 由于它是通过反射实例化类,因此对象不具有自动装配的依赖集。我想要实现的是,扫描所有包(如组件扫描注释中所述),创建bean并设置依赖项。即我希望与应用程序启动时的弹簧完全相同,但是在运行时。 此外,我希望它是完全通用的,因为bean将主要驻留在外部jar中,并且完全限定的类路径和方法名称将在运行时传递(如可插入的体系结构)。
任何想法如何实现这一目标?