有没有方便的方法来获得Spring Bean / Service的名称?

时间:2016-02-04 04:09:24

标签: java spring

我可以使用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);
   }
}

3 个答案:

答案 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<?>)