IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring Bean名称讲解 -> 正文阅读

[Java知识库]Spring Bean名称讲解

一、概述

当我们有多个相同类型的实现时,命名一个Spring bean
非常有用。这是因为如果我们的 bean 没有唯一的名称,那么注入 bean 对 Spring 来说是不明确的。

通过控制 bean 的命名,我们可以告诉 Spring 我们要将哪个 bean 注入目标对象。

在本文中,我们将讨论 Spring bean 命名策略,并探讨如何为单一类型的 bean 赋予多个名称。

2. 默认 Bean 命名策略

Spring为创建 bean提供了多个注解。我们可以在不同的层次上使用这些注释。例如,我们可以在 bean 类上使用一些注解,而在创建 bean 的方法上使用一些注解

首先,让我们看看 Spring 的默认命名策略在起作用。当我们只指定注解而没有任何值时,Spring 如何命名我们的 bean?

2.1。类级注释

让我们从在类级别使用的注解的默认命名策略开始。为了命名一个 bean,Spring 使用类名并将第一个字母转换为小写

我们来看一个例子:

@Service
public class LoggingService {
}

在这里,Spring 为类LoggingService创建一个 bean,并使用名称“?loggingService?”注册它。同样的默认命名策略适用于所有用于创建 Spring bean 的类级别注释,??例如@Component、@Service和@Controller

2.2.?方法级注释

Spring 提供了@Bean和@Qualifer之类的注解,用于创建 bean 的方法。让我们看一个例子来理解@Bean注解的默认命名策略:

@Configuration
public class AuditConfiguration {
    @Bean
    public AuditService audit() {
          return new AuditService();
    }
}

在这个配置类中,Spring在名称“?audit ”下注册了一个AuditService类型的 bean,因为?当我们在方法上使用@Bean注解时,Spring 使用方法名称作为 bean 名称

我们还可以在方法上使用@Qualifier注解,我们将在下面看到一个示例。

3. bean的自定义命名

当我们需要在同一个 Spring 上下文中创建多个相同类型的 bean 时,我们可以为这些 bean 提供自定义名称并使用这些名称来引用它们。

那么,让我们看看如何给我们的 Spring bean 一个自定义名称:

@Component("myBean")
public class MyCustomComponent {
}

这一次,Spring 将创建名为“?myBean ”的MyCustomComponent类型的 bean 。

由于我们明确地为 bean 命名,Spring 将使用这个名称,然后可以使用它来引用或访问 bean。

@Component(“myBean”)类似,我们可以使用@Service(“myService”)@Controller(“myController”)@Bean(“myCustomBean”)等其他注解来指定名称,然后Spring 会注册具有给定名称的 bean。

4. 使用@Bean@Qualifier命名Bean

4.1。@Bean有价值

正如我们之前看到的,@Bean注解是在方法级别应用的,默认情况下,Spring 使用方法名作为 bean 名。

这个默认的 bean 名称可以被覆盖——我们可以使用@Bean注解指定值:

@Configuration
public class MyConfiguration {
    @Bean("beanComponent")
    public MyCustomComponent myComponent() {
        return new MyCustomComponent();
    }
}

在这种情况下,当我们想要获取一个MyCustomComponent类型的 bean 时,我们可以使用名称“?beanComponent?”来引用这个 bean。

Spring?@Bean注解通常在配置类方法中声明。它可以通过直接调用它们来引用同一类中的其他@Bean方法。

4.2.?@Qualifier具有价值

我们也可以使用@Qualifier注解来命名bean。

首先,让我们创建一个接口Animal,它将由多个类实现:

public interface Animal {
    String name();
}
@Component 
@Qualifier("cat") 
public class Cat implements Animal { 
    @Override 
     public String name() { 
        return "Cat"; 
     } 
}

让我们添加另一个Animal的实现,并使用@Qualifier和值“?dog?”对其进行注释:

@Component
@Qualifier("dog")
public class Dog implements Animal {
    @Override
    public String name() {
        return "Dog";
    }
}

现在,让我们编写一个PetShow类,我们可以在其中注入Animal的两个不同实例:

@Service 
public class PetShow { 
    private final Animal dog; 
    private final Animal cat; 

    public PetShow (@Qualifier("dog")Animal dog, @Qualifier("cat")Animal cat) { 
      this.dog = dog; 
      this.cat = cat; 
    }
    public Animal getDog() { 
      return dog; 
    }
    public Animal getCat() { 
      return cat; 
    }
}

Pet?Show 类中,我们通过在构造函数参数上使用@Qualifier注解注入了Animal类型的两种实现,每个注解的值属性中都有限定的 bean 名称。每当我们使用这个限定名时,Spring 都会将具有该限定名的 bean 注入目标 bean。

5. 验证 Bean 名称

到目前为止,我们已经看到了不同的示例来演示为 Spring bean 命名。现在的问题是,我们如何验证或测试这一点?

让我们看一个单元测试来验证行为:

@ExtendWith(SpringExtension.class)
public class SpringBeanNamingUnitTest {
    private AnnotationConfigApplicationContext context;
    
    @BeforeEach
    void setUp() {
        context = new AnnotationConfigApplicationContext();
        context.scan("com.baeldung.springbean.naming");
        context.refresh();
    }
    
 @Test
    void givenMultipleImplementationsOfAnimal_whenFieldIsInjectedWithQualifiedName_thenTheSpecificBeanShouldGetInjected() {
        PetShow petShow = (PetShow) context.getBean("petShow");
        assertThat(petShow.getCat().getClass()).isEqualTo(Cat.class);
        assertThat(petShow.getDog().getClass()).isEqualTo(Dog.class);
    }

在这个 JUnit 测试中,我们在setUp方法中初始化AnnotationConfigApplicationContext?,该方法用于获取 bean。

然后我们简单地使用标准断言验证我们的 Spring bean 的类。


?

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-07-04 22:41:24  更:2022-07-04 22:44:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 15:40:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码