我有多个服务,我想使用他们的类名动态自动装配这些服务。我有一个名为" runCustomService"并且此方法将服务的类名称作为输入参数(例如" Service1"或" Service2")。我想自动装配这些服务并调用其run方法。有没有办法做到这一点?
@Service
public class Service1 extends BaseService{
@Autowired
private AnotherService anotherService;
public void run(){ .... }
}
@Service
public class Service2 extends BaseService{
@Autowired
private AnotherService anotherService;
public void run(){ .... }
}
public void runCustomService(String serviceClassName){
BaseService baseService = //Create baseService object from serviceClassName
baseService.run();
}
答案 0 :(得分:4)
您可以在两个服务上使用限定符,并根据ApplicationContext中的限定符名称获取正确的bean。
@Service
@Qualifier("Service1")
public class Service1 extends BaseService{
@Service
@Qualifier("Service2")
public class Service2 extends BaseService{
@Autowired
ApplicationContext applicationContext;
public void runCustomService(String serviceClassName){
BaseService baseService = applicationContext.getBean(serviceClassName);
baseService.run();
}
答案 1 :(得分:3)
获取ApplicationContext的实例并通过类名获取bean:
@Autowired
ApplicationContext ctx;
使用方法getBean(...):
BaseService baseService = ctx.getBean(Service1.class.getName());
但是,正如另一个答案所说,我建议您使用@Qualifier(...)
有条件地注入某个名称。