Spring 框架是一个强大的 Java 企业应用开发框架,提供了多种依赖注入的方式。其中,@Autowired
和 @Resource
是两个常用的注解,用于实现依赖注入。本文将介绍这两个注解的区别以及在实际应用中如何进行选择。
@Autowired
是由 Spring 框架提供的注解,用于实现自动装配。它是根据类型进行匹配的,可以用在构造方法、Setter 方法、字段上,甚至可以用在方法参数上。
@Autowired
private DemoService DemoService;
@Resource
是 Java EE 提供的注解,Spring 框架也对其提供支持。它是根据名称进行匹配的,可以用在字段、Setter 方法上,也可以用在方法参数上。
@Resource(name = "demoService")
private DemoService DemoService;
@Autowired
没提供明确的属性名称指定,它是根据类型进行匹配的,没有类似于 name
属性的指定方式@Autowired
按照类型匹配进行注入,如果有多个类型匹配,Spring 会选择最匹配的 bean 进行注入。如果没有匹配的bean,会抛出异常
@Resource
按照名称匹配进行注入,首先按照指定的名称查找 bean,如果没有找到,则按照类型查找
@Autowired
是 Spring 提供的注解,更加特定于 Spring 框架
@Resource
是 Java EE 提供的注解,因此在不使用 Spring 框架时也可以使用
? 但是,在 Spring 中更推荐使用 @Autowired
在选择使用 @Autowired
还是 @Resource
时,可以根据具体情况考虑以下几点:
项目框架选择:
如果是纯 Spring 项目,建议使用 @Autowired
,因为它更加灵活,是 Spring 框架本身提供的特性。如果需要与非 Spring 框架的组件进行整合,或者在非 Spring 项目中使用,可以考虑使用 @Resource
依赖注入方式:
如果注重类型匹配,而不关心名称,使用 @Autowired
。如果需要根据名称进行匹配,使用 @Resource
项目约定:
在团队中建议使用一致的注解,以便统一代码风格。可以根据项目的实际情况,选择一种注解作为主要的依赖注入方式
使用@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 {
@Autowired
private 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
的依赖注入。选择使用哪种注解取决于项目的具体需求和约定。