我注意到在弹簧或弹簧mvc中使用注释时,一些程序员会给注释一个名称。例如:
@Repository("customerRepository")
public class CustomerRepositoryImpl implements CustomerRepository{
}
我认为该课程的功能相同而没有给@Repository
一个名字。是否存在将注释命名为有用的情况?
答案 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)
答案 2 :(得分:0)
AnnotationBeanNameGenerator负责为您的bean选择一个名称。如果指定名称,则可以对bean名称使用不同的约定,而不是基于类名称生成的约定。
自动生成的bean名称不是万无一失的;两个具有相同名称的类可能导致重复的bean定义,两个类继承相同的接口也是如此。
使用显式名称还可以确保代码重构不会隐式地破坏bean连接。