有没有理由我们给spring注释一个名字?

时间:2015-07-25 21:39:10

标签: java spring spring-mvc annotations

我注意到在弹簧或弹簧mvc中使用注释时,一些程序员会给注释一个名称。例如:

@Repository("customerRepository")
public class CustomerRepositoryImpl implements CustomerRepository{
}

我认为该课程的功能相同而没有给@Repository一个名字。是否存在将注释命名为有用的情况?

3 个答案:

答案 0 :(得分:4)

它主要用于在执行自动扫描和使用@Autowired时解决歧义。我在this answer中给出了一个彻底的答案,解释了@Autowired,这也解释了为豆子命名的必要性。

假设我们有两个实现CustomerRepository的类:

@Repository
public class MyCustomerRepositoryImpl implements CustomerRepository {
}

@Repository
public class OtherCustomerRepositoryImpl implements CustomerRepository {
}

现在我们假设我们有一个使用@Autowired来注入CustomerRepository的课程:

public class SomeClass {
  @Autowired
  private CustomerRepository customerRepository;
}

执行自动扫描时,您需要有办法区分它们。否则Spring会抛出一个异常,说它不能告诉应该注入哪些bean。

所以我们现在可以为每个实现添加一个逻辑名称:

@Repository("myRepository")
public class MyCustomerRepositoryImpl implements CustomerRepository {
}

@Repository("otherRepository")
public class OtherCustomerRepositoryImpl implements CustomerRepository {
}

现在你可以帮助Spring解决模糊问题如下:

public class SomeClass {
  @Autowired
  @Qualifier("myRepository")
  private CustomerRepository customerRepository;
}

答案 1 :(得分:0)

如果自动检测,它有助于将实体转换为Spring bean。

来自官方文件here: -

  

该值可能表示对逻辑组件名称的建议,   在自动检测组件的情况下变成Spring bean。

答案 2 :(得分:0)

AnnotationBeanNameGenerator负责为您的bean选择一个名称。如果指定名称,则可以对bean名称使用不同的约定,而不是基于类名称生成的约定。

自动生成的bean名称不是万无一失的;两个具有相同名称的类可能导致重复的bean定义,两个类继承相同的接口也是如此。

使用显式名称还可以确保代码重构不会隐式地破坏bean连接。