@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两种注入方式;

如果使用name属性,spring会根据bean的名字来进行依赖注入;如果使用type属性,spring会根据bean的类型来进行依赖注入,如果两个属性都没有进行设置,@Resource默认是根据定义的属性名字去容器中进行匹配,如果没有匹配成功,再根据类型来匹配;如果两个都没有匹配到就会报错

总结:

1.来源不同

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

2.依赖查找顺序不同

@Autowired 先根据类型(bytype)查找 如果存在多个Bean,再根据属性名字(byName)进行查找

@Resource 先根据名字(byName)查找,如果根据名称查不到  再根据类型(bytype)查找

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

@Resource 既可以根据名字匹配(byName),也可以根据属性匹配(byType);因为@Resourc两个属性name type,当配置了name指定时,就会根据名字匹配;使用了type指定就会根据类型匹配;如果两个属性都没有设置,默认就是根据定义的属性名字去容器中进行匹配的,如果 没有匹配成功在进行类型匹配,都没有成功就会报错。

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);
    }
}

  • 20
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: @Resource注解Java中的一种注解,它可以用来标记一个属性、方法或构造函数,告诉容器在进行自动装配时,使用名称或类型来查找需要注入的bean。 @Autowired注解Spring框架中的一种注解,它可以用来标记一个属性、方法或构造函数,告诉容器在进行自动装配时,使用类型来查找需要注入的bean。 ### 回答2: @resource注解和@Autowired注解都是用于在Spring框架中进行依赖注入的方式。 @resource注解是JSR 250规范中的一部分,它可以用来标记一个类的属性或方法来指示Spring容器注入一个特定的资源。可以应用在字段上,在setter方法上,以及在构造函数中,用来注入具体类型的依赖。它可以使用一个name属性来指定要注入的资源的名称,如果没有指定name属性,它将根据变量的名称来查找匹配的资源。@resource注解可以用于注入任何类型的资源,包括其他对象、数据源、事务管理器等。 @Autowired注解Spring框架提供的一种依赖注入方式。它可以通过类型来自动注入一个合适的bean或者其他的依赖项。可以应用在字段上,setter方法上,以及构造函数中。与@resource注解不同的是,@Autowired注解不需要明确指定需要注入的bean的名称,它会根据类型来自动寻找匹配的bean,并将其注入到对应的属性中。如果存在多个相同类型的bean,可以使用@Qualifier注解来指定要注入的bean的名称。在进行注入时,Spring会根据属性的类型,从容器中查找匹配的bean,并将其自动装配到指定的属性中。 总结来说,@resource注解主要用于注入各种类型的资源,可以指定资源的名称,而@Autowired注解主要用于自动注入其他对象或者依赖项,根据类型自动寻找匹配的bean进行注入。 ### 回答3: @Resource注解和@Autowired注解都是Spring框架中用于进行依赖注入注解。 @Resource注解JavaEE的注解,可以用于引用其他组件或者资源。在Spring中,它可以用于注入依赖的组件。@Resource注解两个常用的属性:name和type。name属性可以指定要注入的组件的名称,type属性可以指定要注入的组件的类型。如果两个属性都没有指定,则根据属性的类型进行自动装配。 @Autowired注解Spring框架提供的注解,用于进行自动装配。它可以根据属性的类型进行自动装配,也可以根据属性的名称进行自动装配。当需要装配的组件只有一个时,会根据类型进行匹配。当需要装配的组件有多个时,会根据属性名称进行匹配。如果找不到匹配的组件,会抛出异常。 在使用@Resource注解时,可以使用@Resource和@Autowired注解的效果是一样的,但是@Resource注解的功能更加强大,可以引用其他JavaEE容器的资源,而@Autowired注解只能引用Spring容器中的组件。 总结起来,@Resource注解JavaEE的注解,用于引用其他组件或资源,而@AutowiredSpring框架的注解,用于进行自动装配。在Spring中,可以使用@Resource和@Autowired注解来实现依赖注入的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值