@Autowired和@Resource的区别

一,介绍

1.@Autowired

@Autowired是Spring框架中的注解之一,用于自动装配(Autowired)依赖关系。

在Java中,类与类之间常常存在依赖关系,而这些依赖关系需要通过实例化对象来进行连接。传统的方式是在代码中手动创建对象并进行依赖注入,但这种方式繁琐且容易出错。而使用@Autowired注解,可以由Spring框架自动扫描和装配相应的依赖关系,使得开发者无需手动管理对象的创建和注入。

具体使用@Autowired注解的方式是在需要注入的字段、构造方法或者方法上加上@Autowired注解,Spring框架会根据类型进行匹配并自动注入相应的依赖对象。例如:

@Autowired和@Resource的区别-LMLPHP

在上述示例中,UserService类中的userRepository字段被@Autowired注解修饰,Spring框架会自动查找并注入一个UserRepository类型的实例。

需要注意的是,@Autowired注解默认按照类型进行匹配,如果存在多个符合条件的实例,可以通过@Qualifier注解指定具体的实例名称进行注入。此外,@Autowired注解也可以用于构造方法和方法参数上,实现更灵活的依赖注入。
@Autowired注解是Spring框架中常用的注解之一,用于自动装配bean属性。其中,required属性默认为true,表示被注入的bean是必需的,如果该bean不存在,则注入失败。

如果将@Autowired注解的required属性设置为false,则表示忽略当前要注入的bean,如果有则直接注入,没有则跳过,不会报错。但需要注意的是,当设置为false时,即使该bean不存在,也不会再创建该对象。例如,如果在bean中没有声明Cat对象,即使使用Cat也不会被创建出来,因此调用getCat()方法时返回null。

总之,@Autowired注解的required属性用于指定被注入的bean是否必需,默认为true。如果设置为false,则忽略当前要注入的bean,不会创建该对象。

2.@Resource

@Resource注解是Java中用于依赖注入的注解之一,它属于javax.annotation包。@Resource注解可以用于类、成员变量和方法上,用于标注一个资源需要被注入。

在Spring框架中,@Resource注解可以用来自动装配bean属性,其默认按照名称(byName)方式进行bean装配,也可以按类型(byType)装配。如果没有匹配的bean,则可以通过设置@Resource注解的两个属性:name和type来显式指定byName和byType方式。

在实例中,@Resource注解的使用步骤如下:首先在需要注入的类中声明一个属性,然后在属性上使用@Resource注解来标注该属性需要被注入。例如:

@Autowired和@Resource的区别-LMLPHP

在上面的例子中,@Resource注解标注了userService属性需要被注入,并且通过name属性显式指定了注入的bean名称。在Spring容器中需要有一个id为"userService"的bean来匹配该属性,并将其值注入到该属性中。如果容器中没有该名称的bean,则会导致注入失败。

@Resource注解有两个重要的属性,分别是name和type。

name属性用于指定bean的名字,Spring将根据该属性值在容器中查找有与之相等的name属性的bean,然后将其装配到被注解的变量中。如果找不到符合的bean,或者找到多个,都会抛出异常。

type属性用于指定bean的类型,Spring将根据该属性值在容器中找到类型匹配的唯一bean进行装配。如果找不到或者找到多个,都会抛出异常。

如果@Resource注解的name属性和type属性都没有指定,那么Spring将使用反射机制按byName自动注入策略进行装配。如果同时指定了name属性和type属性,那么Spring将根据这两个属性值在容器中找到唯一匹配的bean进行装配。

总之,@Resource注解的name属性和type属性用于指定需要注入的bean的名称和类型,从而让Spring框架能够自动装配相应的bean。

二,@Autowired和@Resource的区别

@Autowired和@Resource都是Java中用于依赖注入的注解,但它们之间存在一些区别。

1.提供的注解不同:@Autowired是Spring框架提供的注解,而@Resource是Java JSR-250规范中定义的注解。
2。装配方式不同:@Autowired默认按类型装配,如果需要按名称装配,需要结合@Qualifier注解使用。而@Resource默认按名称装配,如果找不到与名称匹配的bean,则再按类型装配。
3.依赖的bean存在性不同:@Autowired要求依赖的bean必须存在,否则会抛出异常。而@Resource则不强制要求依赖的bean存在,即使不存在也不会抛出异常。
4.支持的自动装配类型不同:@Autowired只支持Spring框架中的自动装配类型。而@Resource不仅支持Spring框架中的自动装配类型,还支持JDK提供的@Resource和javax inject提供的@Inject注解。
总之,@Autowired和@Resource都是用于依赖注入的注解,但它们在提供者、装配方式、依赖存在性以及支持的自动装配类型方面存在一些区别。具体使用哪个注解需要根据实际情况进行选择。

10-28 05:39