问题描述
我注意到在对spring或spring mvc使用批注时,一些程序员会给批注命名。 例如:
@Repository("customerRepository")
public class CustomerRepositoryImpl implements CustomerRepository{
}
我相信该类的功能相同,而没有给@Repository
命名。
是否存在将注释命名为有用的情况?
1楼
它主要用于解决执行自动扫描和使用时的歧义。
我在给出了有关@Autowired
的详尽答案, 还解释了需要命名bean的问题。
假设我们有2个实现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;
}
2楼
如果自动检测到,它将有助于将实体转换为Spring bean。
从的官方文档:-
该值可能表明建议使用逻辑组件名称,以在自动检测到组件的情况下将其转换为Spring bean。
3楼
负责为您的bean选择一个名称。 如果您指定一个名称,则可以为您的bean名称使用不同的约定,而不是根据类名生成约定。
自动生成的Bean名称并非万无一失。 具有相同名称的两个类可以导致重复的bean定义,两个类继承相同的接口也可以。
使用显式名称还可以确保代码重构不会隐式中断Bean连线。