我可以使用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);
}
}
答案 0 :(得分:1)
没有;你基本上要求反转一张地图。 Bean可以使用任意甚至多个名称进行注册,并且名称可以在运行时来自各个位置 - 类名,组件注释,@Configuration
方法,XML等。找到给定特定对象的名称的唯一方法是枚举所有bean并找出哪些条目匹配。
更新:根据您的代码示例,您似乎想要绕过两个更简单的模式。您当前方法的更直接实现是使用该类直接请求bean:
@Autowired ApplicationContext ctx;
...
implementation = ctx.getBean(Impl2.class);
然而,这似乎是用多态性替换有条件的情况:虽然你已经用一般术语表达了你的问题,但通常 适合于enum知道类(因此交换机被strategy.getImplementingClass()
替换)或者服务直接知道信息(例如,参见Converter
实例如何识别它们可以操作的对象对于他们的用户而言,并且为了获得Set<IThing>
并对其进行迭代以查询合适的匹配。
答案 1 :(得分:1)
你的 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;
}
}
答案 2 :(得分:0)
org.springframework.beans.factory.ListableBeanFactory#getBeanNamesForType(java.lang.Class<?>)
org.springframework.beans.factory.BeanFactoryUtils#beanNamesForTypeIncludingAncestors(org.springframework.beans.factory.ListableBeanFactory, java.lang.Class<?>)