有没有一种方便的方法来获取 Spring Bean/服务的名称?

orb*_*ish 6 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);
   }
}
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)


chr*_*ke- 3

不; 你基本上是在要求反转地图。Bean 可以使用任意甚至多个名称进行注册,并且该名称可以在运行时来自各个位置——类名称、组件注释、方法@Configuration、XML 等等。查找给定特定对象的名称的唯一方法是枚举所有 bean 并查找哪些条目匹配。

更新:根据您的代码示例,您似乎正在尝试围绕两种更简单的模式走很长的路。当前方法的更直接实现是直接使用类来请求 bean:

@Autowired ApplicationContext ctx;
...
implementation = ctx.getBean(Impl2.class);
Run Code Online (Sandbox Code Playgroud)

然而,这似乎是用多态性替换条件的情况:虽然您用一般术语表达了您的问题,但通常情况下,枚举适合了解类(因此开关被替换为strategy.getImplementingClass())或适合服务直接了解信息(例如,请参阅Converter实例如何识别它们可以对其用户进行操作的对象),并让您获取Set<IThing>并迭代它们以查询合适的匹配项。