我可以执行 SomeSpringService.class.getSimpleName() 并小写第一个字母来获取默认的 bean 名称,但我想知道是否有一个简单的 Spring 函数可以为我找到这个名称?简单的意思是我没有获得应用程序上下文,或构建工厂等。
谢谢
更新:当前黑客
@Service
public class ServiceSelector
{
@Autowired
Map<String, IThing> implementations;
public SomethingInterface getDecisionStrategy(AnEnum type)
{
SomethingInterface something;
switch (type)
{
case ONE:
implementation = findInstance(Impl1.class);
break;
case TWO:
implementation = findInstance(Impl2.class);
break;
default:
implementation = findInstance(Impl2.class);
}
return implementation;
}
private SomethingInterface findInstance(Class clazz)
{
String className = clazz.getSimpleName();
String defaultBeanName = Character.toLowerCase(className.charAt(0)) + className.substring(1);
return implementations.get(defaultBeanName);
}
}
Run Code Online (Sandbox Code Playgroud)
小智 7
你的bean可以实现BeanNameAware,所以你必须在你的类中添加setBeanName(String beanName)。Spring IoC 将返回您的 bean 名称。
例如:
public class Control implements BeanNameAware{
private String beanName;
@Override
public void setBeanName(String s) {
this.beanName = beanName;
}
}
Run Code Online (Sandbox Code Playgroud)
不; 你基本上是在要求反转地图。Bean 可以使用任意甚至多个名称进行注册,并且该名称可以在运行时来自各个位置——类名称、组件注释、方法@Configuration、XML 等等。查找给定特定对象的名称的唯一方法是枚举所有 bean 并查找哪些条目匹配。
更新:根据您的代码示例,您似乎正在尝试围绕两种更简单的模式走很长的路。当前方法的更直接实现是直接使用类来请求 bean:
@Autowired ApplicationContext ctx;
...
implementation = ctx.getBean(Impl2.class);
Run Code Online (Sandbox Code Playgroud)
然而,这似乎是用多态性替换条件的情况:虽然您用一般术语表达了您的问题,但通常情况下,枚举适合了解类(因此开关被替换为strategy.getImplementingClass())或适合服务直接了解信息(例如,请参阅Converter实例如何识别它们可以对其用户进行操作的对象),并让您获取Set<IThing>并迭代它们以查询合适的匹配项。
| 归档时间: |
|
| 查看次数: |
17054 次 |
| 最近记录: |