java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > @Resource和@Autowired两个注解区别

@Resource和@Autowired两个注解的区别及说明

作者:有WiFi就好说

这篇文章主要介绍了@Resource和@Autowired两个注解的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

回答

首先这@Resource @Autowired这两个注解都是Spring生态里去实现Bean的依赖注入(在springmvc项目和springboot项目中都可以使用)

下面我在说一下这个注解的区别

1.@Autowired

@AutowiredSpring里面提供的一个注解,它默认是根据类型来实现Bean的依赖注入;

@Autowired里面有一个required属性,默认值是true 表示强制要求bean实例的一个注入,在应用启动的时候,如果IOC容器中不存在对应类型的bean,那么启动就会报错;如果我们不希望实现依赖注入就可以把这个属性设置为false

其次如果Spring IOC容器中存在多个相同类型的bean实例,但是由于@Autowired是根据类型去进行注入的,所以Spring启动的时候就会提示一个错误,就是原本只能注入一个单实例Bean,但是现在Ioc容器存在多个,导致注入失败;针对这个问题,可以使用@Primary @Qualifier这两个注解来解决;

@Primary表示主要的Bean,当存在多个相同类型的Bean的时候,会优先使用声明了@Primary注解的一个Bean

@Qualifier 相当于条件筛选,可以根据Bean的名字可以去找到需要装配的目标Bean

2.@Resource

接下来我再解释一下@Resource这个注解,@Resource是JDK中提供的一个注解,只不过Spring在实现上提供了这个注解的一个功能支持,它的使用方式和@Autowired类似,

最大的区别就是@Resource可以支持ByName 和 ByType两种注入方式;

总结

1.来源不同

@Autowired 是Spring提供的一个注解,@Resource是JSR 250规范里定义的一个注解,只不过Spring对JSR 250提供了支持

2.依赖查找顺序不同

@Autowired默认是根据类型来进行匹配的,如果容器中存在多个类型相同的实例就会报错,此时可以通过配合@Primary或@Qualifier注解来实现根据名字进行装配

3.支持的参数不同

@Resource支持7个参数 最常用的就是name type

@Autowired 只支持一个参数 required

4.依赖注入的支持不同

@Autowired 支持构造方法注入,属性注入,Setter方法注入

@Resource 只支持属性注入,Setter方法注入 不支持构造方法注入

5.编译器IDEA的提示不同

当注入Mapper对象时,使用@Autowired注解 编译器会报错,而是用@Resource注解则不会提示错误

注入方式实例

1.属性注入

@RestController
public class UserController {
    // 属性注入
    @Autowired
    private UserService userService;
 
    @RequestMapping("/add")
    public UserInfo add(String username, String password) {
        return userService.add(username, password);
    }
}

2.setter方法注入

@RestController
public class UserController {
    // Setter 注入
    private UserService userService;
 
    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
 
    @RequestMapping("/add")
    public UserInfo add(String username, String password) {
        return userService.add(username, password);
    }
}

3.构造方法注入

@RestController
public class UserController {
    // 构造方法注入
    private UserService userService;
 
    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }
 
    @RequestMapping("/add")
    public UserInfo add(String username, String password) {
        return userService.add(username, password);
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文