interview
backend-classic
有哪些注解可以注入 BeanAutowired 和 Resource 的区别

后端经典面试题合集, 有哪些注解可以注入 Bean?@Autowired 和 @Resource 的区别?

后端经典面试题合集, 有哪些注解可以注入 Bean?@Autowired 和 @Resource 的区别?

QA

Step 1

Q:: 有哪些注解可以注入 Bean?

A:: 在 Spring 框架中,注入 Bean 的注解主要有以下几种:

1. @Autowired: 这是 Spring 提供的用于自动注入依赖的注解。它可以应用在构造函数、方法、字段上,Spring 会自动查找与注入点匹配的 Bean。

2. @Qualifier: 通常与 @Autowired 一起使用,用于当多个 Bean 可以注入时,指定要注入哪个具体的 Bean。

3. @Resource: 这是 Javax 提供的注解,类似于 @Autowired,但它是按名称进行注入的,如果名称找不到匹配的 Bean,再按类型注入。

4. @Inject: 这是 JSR-330 提供的注解,功能类似于 @Autowired,但不支持 @Qualifier 这样的限定符。

5. @Value: 用于注入配置文件中的值,例如注入一个属性文件中的值或系统环境变量。

Step 2

Q:: @Autowired 和 @Resource 的区别?

A:: @Autowired 和 @Resource 的主要区别如下:

1. 来源不同:@Autowired 是 Spring 提供的注解,而 @Resource 是 Javax 提供的注解。

2. 注入方式不同:@Autowired 默认按类型注入,而 @Resource 默认按名称注入。如果 @Resource 指定了 name 属性,则按名称注入;如果没有指定 name 属性,则按类型注入。

3. 依赖检查:@Autowired 可以与 @Primary、@Qualifier 等注解一起使用来解决 Bean 注入时的歧义问题,而 @Resource 只能通过名称或类型匹配。

4. 作用范围:@Autowired 可以在 Spring 容器管理的任何地方使用,而 @Resource 主要用于 J2EE 容器的管理。

用途

面试中会考察这些内容是因为它们是理解 Spring 框架中依赖注入(Dependency Injection`,` DI)机制的核心。依赖注入是 Spring 的基础特性之一,在实际生产环境中,如何选择和使用不同的注解来实现依赖注入,直接影响到应用程序的灵活性和可维护性。比如在项目中,你可能会需要根据不同的配置文件或环境注入不同的 Bean,理解这些注解的区别和使用场景至关重要。\n

相关问题

🦆
什么是 Spring 的依赖注入DI?

依赖注入是 Spring 核心概念之一,是一种设计模式,用于将对象的依赖关系从代码中移除,而在对象实例化时由容器来管理。通过依赖注入,代码可以更加松耦合,更易于测试和维护。Spring 提供了构造函数注入、Setter 注入以及字段注入等方式来实现 DI。

🦆
如何解决 Spring 中的循环依赖问题?

Spring 解决循环依赖问题主要有三种方式:

1. 构造函数注入时,Spring 不会尝试解决循环依赖,会直接抛出 BeanCurrentlyInCreationException。

2. 使用 Setter 注入,Spring 会在创建第一个 Bean 时,先生成一个未完全初始化的对象(即只是创建了对象的引用,还未进行属性赋值),然后再为其注入依赖。

3. 通过 @Lazy 注解来延迟加载依赖,从而打破循环依赖。

🦆
什么是 Spring 的 AOP,如何在项目中使用?

AOP(Aspect-Oriented Programming)是面向切面编程的缩写,是 Spring 提供的一种处理横切关注点(如日志记录、事务管理)的机制。通过 AOP,可以将这些通用的功能抽象出来,避免在各处重复代码。Spring AOP 通常使用 @Aspect 注解定义切面,并通过 @Around、@Before、@After 等注解来定义增强方法。

🦆
Spring 中的 @Primary 和 @Qualifier 有什么区别?

@Primary 和 @Qualifier 都是用于解决依赖注入时出现的 Bean 歧义问题的注解。

1. @Primary 是全局配置,当存在多个符合条件的 Bean 时,默认选择标有 @Primary 的 Bean。

2. @Qualifier 是局部配置,通常与 @Autowired 一起使用,可以在注入时指定一个具体的 Bean,而不是全局性的默认 Bean。