首页 > 其他分享 >Autowired和Resource的区别和联系

Autowired和Resource的区别和联系

时间:2022-09-21 13:34:12浏览次数:50  
标签:byType Resource 区别 Autowired byName 匹配 userService UserService

 

联系

 @Autowired和@Resource注解都是作为bean对象注入的时候使用的两者都可以声明在字段和setter方法上

注意:如果声明在字段上,那么就不需要再写setter方法。但是本质上,该对象还是作为set方法的实参,通过执行set方法注入,只是省略了setter方法罢了

区别

@Autowired注解是Spring提供的,而@Resource注解是J2EE本身提供的
@Autowird注解默认通过byType方式注入,而@Resource注解默认通过byName方式注入
@Autowired注解注入的对象需要在IOC容器中存在,否则需要加上属性required=false,表示忽略当前要注入的bean,如果有直接注入,没有跳过,不会报错
对于byName和byType方式不太熟悉的可以看一下这里:Spring中的byName与byType

简单来说,byName就是变量名去匹配bean的id属性,而byType则是变量类型去匹配bean的class属性

<bean id="userService" class="com.test.UserServiceImpl">
</bean>

@Autowired
private UserService userService;

此处byName就是拿变量名userService去匹配IOC容器的iduserService,匹配成功;而byType就是拿变量类型UserService去匹配IOC容器的idcom.test.UserService.UserServiceImpl,因为UserServiceImpl是UserService实现,所以也匹配成功

接下来再分别讲讲@Autowired注解和@Resource注解的使用

@Autowird注解的使用
步骤:@Autowird默认的注入方式为byType,也就是根据类型匹配,当有多个实现时,则通过byName注入,也可以通过配合@Qualifier注解来显式指定name值,指明要使用哪个具体的实现类

举例:

首先有一个接口UserService和两个实现类UserServiceImpl1和UserServiceImpl2,并且这两个实现类已经加入到Spring的IOC容器中了

@Service
public class UserServiceImpl1 implements UserService

@Service
public class UserServiceImpl2 implements UserService

通过@Autowired注入使用

@Autowired
private UserService userService;

根据上面的步骤,可以很容易判断出,直接这么使用是会报错的
原因:首先通过byType注入,判断UserService类型有两个实现,无法确定具体是哪一个,于是通过byName方式,这里的变量名userService也无法匹配IOC容器中id(此处指的userServiceImpl1和userServiceImpl2),于是报错。

注意:通过注解注入到IOC容器的id值默认是其类名首字母小写

解决方案

方式一:

// 方式一:改变变量名
@Autowired
private UserService userServiceImpl1;

方式二:

// 方式二:配合@Qualifier注解来显式指定name值

@Autowired
@Qualifier(value = "userServiceImpl1")
private UserService userService;

@Resource注解的使用
步骤:@Resource默认通过byName注入,如果没有匹配则通过byType注入

举例:

复制代码
@Service
public class UserServiceImpl1 implements UserService

@Service
public class UserServiceImpl2 implements UserService

@Resource
private UserService userService;
复制代码

首先通过byName匹配,变量名userService无法匹配IOC容器中任何一个id(这里指的userServiceImpl1和userServiceImpl2),于是通过byType匹配,发现类型UserService的实现类有两个,仍然无法确定,于是报错。

同时@Resource还有两个重要的属性:name和type,用来显式指定byName和byType方式注入

使用:对应4种情况

复制代码
// 1. 默认方式:byName
@Resource
private UserService userDao;

// 2. 指定byName
@Resource(name="userService")
private UserService userService;

// 3. 指定byType
@Resource(type=UserService.class)
private UserService userService;

// 4. 指定byName和byType
@Resource(name="userService",type=UserService.class)
private UserService userService;
复制代码

既没指定name属性,也没指定type属性:默认通过byName方式注入,如果byName匹配失败,则使用byType方式注入(也就是上面的那个例子)
指定name属性:通过byName方式注入,把变量名和IOC容器中的id去匹配,匹配失败则报错
指定type属性:通过byType方式注入,在IOC容器中匹配对应的类型,如果匹配不到或者匹配到多个则报错
同时指定name属性和type属性:在IOC容器中匹配,名字和类型同时匹配则成功,否则失败

转自:https://www.cnblogs.com/wangju/p/15103640.html

标签:byType,Resource,区别,Autowired,byName,匹配,userService,UserService
From: https://www.cnblogs.com/manmanblogs/p/16715275.html

相关文章

  • 面试官:为什么 Spring 和 IDEA 都不推荐使用 @Autowired 注解??
    作者:小亮哥Ya链接:https://juejin.cn/post/7080441168462348319大家在使用IDEA开发的时候有没有注意到过一个提示,在字段上使用Spring的依赖注入注解@Autowired后会出现如......
  • 数据库删除常用方法与区别分析 TRUNCATE和DELETE只删除数据,DROP则删除整个表(结构和数
    数据库删除常用方法与区别分析TRUNCATE和DELETE只删除数据,DROP则删除整个表(结构和数据)学习如何使用数据库是大多数软件编程开发程序员都应该熟练掌握的一个编程技......
  • IPv4与IPv6的联系与区别
    联系:IPv4和IPv6主机之间可以通过双栈协议技术、隧道技术、网络地址换转技术等过渡技术实现相互通信。IP地址是网络中的重要概念之一,其中就包括了IPv4地址和IPv6地址,而日......
  • IPV4和IPV6的区别
    为什么要使用IPV6?在过去我们都认为32位的IPV4足够提供给全世界的人使用。但是就像电话一样以前的四位到后来的八位,再到如今的十一位。而IP地址也同样面临着相同的问题,在当......
  • 虚方法和抽象方法的区别?
     继承:虚方法修饰符virtual,才能重写override虚方法和抽象方法的区别:虚方法必须有实现部分,抽象方法不可以有实现部分;虚方法可以在派生类中重写也可以不重写,抽象方法必......
  • 重载和重写的区别?
    一、定义上的区别:重载是指不同的函数使用相同的函数名,但是函数的参数个数或类型不同。调用的时候根据函数的参数来区别不同的函数。覆盖(也叫重写)是指在派生类中重新对基......
  • String、StringBuffer和StringBuilder区别
    String、StringBuffer和StringBuilder区别1、StringBuffer和StringBuilder非常的类似,均表示字符可变序列,方法也一样。2、String表示不可变的字符序列,效率低,复用性高。3......
  • 获取请求; .then 和 async/await 的区别
    获取请求;.then和async/await的区别javascript中的异步代码可能会令人困惑、棘手且难以理解。但是,异步代码使我们的程序更加高效、易用,现代网页完全依赖它!作为开发人......
  • cookie和session的区别
    1.cookie数据存放在客户端浏览器上,session数据存放在服务器上2.cookie不是很安全,别人可以分析存放在本地cookie并进行cookie欺骗,考虑到安全应当使用使用session3.session......
  • python-赋值、浅拷贝、深拷贝的区别
    Python中有6个标准的数据类型,它们又分为可变对象和不可变对象不可变对象:Number(数字)、String(字符串)、Tuple(元组)可变对象:List(列表)、Dictionary(字典)、Set(集合)可变对象是指......