我正在尝试使用属性占位符值定义服务 bean 名称。但是得到错误说没有找到特定名称的bean。我知道问题在于读取属性值,因为在硬编码值时它正在工作。请帮忙,因为我需要从属性文件中读取值。下面的代码片段:
应用程序属性
event.testRequest=TEST_REQUEST
服务等级
@Service("${event.testRequest}") // This is not working, getting "No bean named 'TEST_REQUEST' available" error
// @Service("TEST_REQUEST") // This is working
public class TestRequestExecutor extends DefaultExecutionService {
...
}
此外,为了确认属性值读取正确,我尝试使用@Value("${event.testRequest}") private String value
我得到值“TEST_REQUEST”的位置,如预期的那样。不确定如何将其与 @Service 注释一起使用。
编辑: 为了详细说明外部化服务 bean 名称的需要,我使用工厂模式来获取基于事件名称(事件名称,例如 Event1、Event2 ..)的实现。如果事件名称发生更改,则更改将仅发生在属性文件上,而不是使用属性占位符的服务 bean 名称。
@RestController
public class RequestProcessController {
@Autowired
private ExecutorFactory executorFactory;
..
ExecutionService executionService = executorFactory.getExecutionService(request.getEventType());
executionService.executeRequest(request);
..
}
@Component
public class ExecutorFactory {
private BeanFactory beanFactory;
public ExecutionService getExecutionService(String eventType) {
return beanFactory.getBean(eventType, DefaultExecutionService.class);
}
这里DefaultExecutionService
有不同的实现,如下所示..
@Service("${event.first}")
public class Event1Executor extends DefaultExecutionService {..}
..
@Service("${event.second}")
public class Event2Executor extends DefaultExecutionService {..}
event.first = Event1
event.second = Event2
所以基本上将来如果Event1名称更新为EventOne,我只需要更新属性文件,而不是服务类。
非常感谢任何帮助!谢谢!