文章目录
- 1. 区别
- 1)匹配方式
- 2)属性名称
- 3)处理方式
- 4)支持类型
- 2. 如何选择
- 3. 代码示例
Spring 框架是一个强大的 Java 企业应用开发框架,提供了多种依赖注入的方式。其中,@Autowired
和 @Resource
是两个常用的注解,用于实现依赖注入。本文将介绍这两个注解的区别以及在实际应用中如何进行选择。
1. 区别
1)匹配方式
-
@Autowired
是由 Spring 框架提供的注解,用于实现自动装配。它是根据类型进行匹配的,可以用在构造方法、Setter 方法、字段上,甚至可以用在方法参数上。@Autowired private DemoService DemoService;
-
@Resource
是 Java EE 提供的注解,Spring 框架也对其提供支持。它是根据名称进行匹配的,可以用在字段、Setter 方法上,也可以用在方法参数上。@Resource(name = "demoService") private DemoService DemoService;
2)属性名称
@Autowired
没提供明确的属性名称指定,它是根据类型进行匹配的,没有类似于name
属性的指定方式
3)处理方式
-
@Autowired
按照类型匹配进行注入,如果有多个类型匹配,Spring 会选择最匹配的 bean 进行注入。如果没有匹配的bean,会抛出异常 -
@Resource
按照名称匹配进行注入,首先按照指定的名称查找 bean,如果没有找到,则按照类型查找
4)支持类型
-
@Autowired
是 Spring 提供的注解,更加特定于 Spring 框架 -
@Resource
是 Java EE 提供的注解,因此在不使用 Spring 框架时也可以使用✨ 但是,在 Spring 中更推荐使用
@Autowired
2. 如何选择
在选择使用 @Autowired
还是 @Resource
时,可以根据具体情况考虑以下几点:
-
项目框架选择:
如果是纯 Spring 项目,建议使用
@Autowired
,因为它更加灵活,是 Spring 框架本身提供的特性。如果需要与非 Spring 框架的组件进行整合,或者在非 Spring 项目中使用,可以考虑使用@Resource
-
依赖注入方式:
如果注重类型匹配,而不关心名称,使用
@Autowired
。如果需要根据名称进行匹配,使用@Resource
-
项目约定:
在团队中建议使用一致的注解,以便统一代码风格。可以根据项目的实际情况,选择一种注解作为主要的依赖注入方式
3. 代码示例
使用@Autowired注解的示例:
DemoService.java
package com.cheney.demo.service;import org.springframework.stereotype.Service;@Service
public class DemoService {public void syaHello(){System.out.println("Hello");}
}
DemoController.java
package com.cheney.demo.controller;import com.cheney.demo.service.DemoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController;@RestController
public class DemoController {@Autowiredprivate DemoService demoService;public void hello() {demoService.syaHello();}
}
使用@Resource注解的示例:
DemoService.java
package com.cheney.demo.service;import org.springframework.stereotype.Service;@Service
public class DemoService {public void syaHello(){System.out.println("Hello");}
}
DemoController.java
package com.cheney.demo.controller;import com.cheney.demo.service.DemoService;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.RestController;@RestController
public class DemoController {@Resource(name = "demoService")private DemoService demoService;public void hello() {demoService.syaHello();}
}
在以上示例中,DemoService
是一个服务类,DemoController
是一个控制器类。通过 @Autowired
或 @Resource
注解,实现了 DemoService
的依赖注入。选择使用哪种注解取决于项目的具体需求和约定。