@Autowired自动装配,@Bean注入@Primary,@Qualifier优先级讲解

下面是对@Autowired、@Bean和@Qualifier的详细讲解:

@Autowired自动装配

概念

@Autowired 注解是用于自动将某个类型的 bean 注入到另一个 bean 中的注解。在 Spring 容器中,如果一个接口只被一个具体实现类所实现,那么 Spring 在注入时会自动识别该实现类,并将其注入到另一个 bean 中。

示例

假如有一个UserService接口,它有两个实现类分别是UserServiceImplUserServiceImpl2,我们需要将UserServiceImpl2作为被注入对象。

首先,我们需要在UserServiceImpl2 class 上添加@Service注解,以将该类注入到 Spring 容器:

@Service
public class UserServiceImpl2 implements UserService {
// 省略具体实现方法
}

然后,在需要注入UserServiceImpl2的 class 上,使用@Autowired注解进行注入:

@Service
public class UserController {
  @Autowired
  UserService userService; // 代码中使用注解注入 UserServiceImpl2 实例
// 省略具体实现方法
}

@Bean注入

概念

@Bean注解可以用来将某个对象注册为一个 bean,并将其交由 Spring 容器来管理。

示例

我们可以在一个配置文件中定义一个返回UserDaoImpl@Bean

@Configuration
public class AppConfig {
  @Bean
  UserDao userDao() {
    return new UserDaoImpl();
  }
}

在这个@Configuration类中,方法名就是定义的 bean 名称,而方法返回值就是 bean 的实例。这意味着我们可以在任何需要userDao的地方使用自动装配,例如:

@Service
public class UserServiceImpl implements UserService {
  @Autowired
  UserDao userDao;
// 省略具体实现方法
}

@Primary注解

概念

当我们有多个同一个接口的实现类时,我们需要使用@Primary注解来标识一个默认的实现类。

示例

我们假设有两个实现了UserService接口的类UserServiceImplUserServiceImpl2,并且有一个需要注入 UserService 的类UserController,Spring 怎么知道注入哪个 UserService 实现类呢?

我们可以在其中一个实现类上添加@Primary注解,来告诉 Spring 使用哪个默认的实现类:

@Service
@Primary
public class UserServiceImpl2 implements UserService {
// 省略具体实现方法
}

@Service
public class UserServiceImpl implements UserService {
// 省略具体实现方法
}

这样,在使用自动装配时,如果没有指定使用 UserService 实现类,Spring 就会使用带有@Primary注解的 UserService 实现类。

@Qualifier注解

概念

@Qualifier注解用于针对一个接口有多个实现类的情况下,指定使用哪个实现类进行注入。

示例

我们假设有两个实现了UserService接口的类UserServiceImplUserServiceImpl2,我们需要在需要注入 UserService 的类中,使用@Qualifier注解指定使用哪个 UserService 实现类进行注入:

@Service
public class UserController {
  @Autowired
  @Qualifier("userServiceImpl2") // 显式指定使用 UserServiceImpl2
  UserService userService;
// 省略具体实现方法
}

@Qualifier中使用实现类的名称,来告诉 Spring 使用哪个具体的实现类。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:@Autowired自动装配,@Bean注入@Primary,@Qualifier优先级讲解 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • java+io+swing实现学生信息管理系统

    Java+IO+Swing实现学生信息管理系统 学生信息管理系统是一款常见的管理工具,它可以帮助学校、老师或管理员轻松地管理学生的信息。本篇攻略将会使用Java语言结合IO和Swing技术来实现学生信息管理系统。 1. 项目搭建 首先打开你喜欢的IDE,选择新建Java项目,并添加Swing库。 然后新建一个Main类,它将作为程序的入口点。接下来,创建一个…

    Java 2023年5月24日
    00
  • jdbc中自带MySQL 连接池实践示例

    下面是 “jdbc中自带MySQL 连接池实践示例” 的详细攻略: 准备工作 下载并安装 MySQL 数据库,创建一个名为 test 的数据库并创建一个名为 user 的表,包含 id、name、age 三个字段。 下载并安装 JDK,确认环境变量配置正确。 示例一:使用 DriverManager 方式连接数据库 导入 JDBC 驱动 // 导入MySQL…

    Java 2023年6月16日
    00
  • Java 类型信息详解和反射机制介绍

    Java 类型信息详解和反射机制介绍 Java是一种强类型语言,因此在编写Java程序时,对于变量、方法、类及接口等定义都需要指定明确的类型信息。Java提供了反射机制,可以在程序运行时获取类的信息及其成员对象,以及对这些对象进行操作。 Java 类型信息 Java的类型系统可以分为两类:原始类型与引用类型。Java的原始类型有八种,分别是boolean、b…

    Java 2023年5月26日
    00
  • Java超详细介绍抽象类与接口的使用

    Java超详细介绍抽象类与接口的使用 在Java语言中,抽象类和接口是两种重要的语法结构,它们可以用来描述一类对象所共有的特性和行为。本文将从定义、特点、使用场景、实现方式等多个方面,超详细地介绍抽象类和接口在Java中的使用。 抽象类的定义和特点 抽象类是一种特殊的类,它不能直接被实例化,只能用来作为其他类的基类。抽象类中包含了多个方法的定义,这些方法可以…

    Java 2023年5月26日
    00
  • springboot通过注解、接口创建定时任务详解

    让我详细讲解一下关于“springboot通过注解、接口创建定时任务”的完整攻略。 一、创建定时任务需要的依赖 在项目中,需要导入以下依赖: <!– Spring Boot定时器需要的依赖 –> <dependency> <groupId>org.springframework.boot</groupId>…

    Java 2023年5月19日
    00
  • Java NIO和IO的区别

    Java NIO和IO是两种处理I/O操作的不同方式,Java NIO提供了一种高效的、基于缓冲区的I/O操作,而传统的Java IO则是基于流式(stream-based)的方式。 以下是Java NIO和IO的几个重要区别: 缓冲区(Buffer)与流(Stream)的区别 Java IO是面向流的编程,数据从一个地方流动到另一个地方,通常是通过Inpu…

    Java 2023年5月19日
    00
  • Java的Struts框架报错“InvalidSubscriptionException”的原因与解决办法

    当使用Java的Struts框架时,可能会遇到“InvalidSubscriptionException”错误。这个错误通常由以下原因之一起: 配置错误:如果配置文件中没有正确配置订阅,则可能会出现此。在这种情况下,需要检查配置文件以解决此问题。 订阅名称错误:如果订阅名称不正确,则可能会出现此。在这种情况下,需要检查订阅名称以解决此问题。 以下是两个实例:…

    Java 2023年5月5日
    00
  • 最新JVM垃圾回收算法详解

    最新JVM垃圾回收算法详解 Java虚拟机(JVM) 是一种在计算机上运行Java程序的运行环境,它通过不断的优化来提高Java程序的运行效率和稳定性。其中,垃圾回收算法是JVM中重要的一环,如何实现高效的垃圾回收是一个长期以来的研究方向。本文将详细讲解Java中最新的垃圾回收算法。 什么是垃圾回收? 在Java中,内存是由JVM管理的。在程序运行时,一些对…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部