当前位置: 代码迷 >> java >> 我们给spring批注命名是有原因的吗?
  详细解决方案

我们给spring批注命名是有原因的吗?

热度:111   发布时间:2023-07-17 20:04:42.0

我注意到在对spring或spring mvc使用批注时,一些程序员会给批注命名。 例如:

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

我相信该类的功能相同,而没有给@Repository命名。 是否存在将注释命名为有用的情况?

它主要用于解决执行自动扫描和使用时的歧义。 我在给出了有关@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;
}

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

从的官方文档:-

该值可能表明建议使用逻辑组件名称,以在自动检测到组件的情况下将其转换为Spring bean。

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

自动生成的Bean名称并非万无一失。 具有相同名称的两个类可以导致重复的bean定义,两个类继承相同的接口也可以。

使用显式名称还可以确保代码重构不会隐式中断Bean连线。

  相关解决方案