• @Autowired和@Resource注解的区别和联系


    直接看原文

    原文链接:

    【精选】@Autowired和@Resource注解的区别和联系【精选】

    -------------------------------------------------------------------------------------------------------------------------------

    先说联系

    联系

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

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

    区别

    1. @Autowired注解是Spring提供的,而@Resource注解是J2EE本身提供的
    2. @Autowird注解默认通过byType方式注入,而@Resource注解默认通过byName方式注入
    3. @Autowired注解注入的对象需要在IOC容器中存在,否则需要加上属性required=false,表示忽略当前要注入的bean,如果有直接注入,没有跳过,不会报错

    对于byName和byType方式不太熟悉的可以看一下这里:Spring中的byName与byType

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

    1. <bean id="userService" class="com.test.UserServiceImpl">
    2. </bean>
    1. @Autowired
    2. 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容器中了

    1. @Service
    2. public class UserServiceImpl1 implements UserService
    3. @Service
    4. public class UserServiceImpl2 implements UserService

    在spring容器中的配置体现就是下面的, 下面的id默认就是类名首字母的小写,class就是全类名.

    1. <bean id="userServiceImpl1 " class="com.test.UserServiceImpl1">
    2. </bean>
    3. <bean id="userServiceImpl2 " class="com.test.UserServiceImpl2">
    4. </bean>

    通过@Autowired注入使用

    1. @Autowired
    2. private UserService userService;

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

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

    解决方案

    方式一:

    1. // 方式一:改变变量名
    2. @Autowired
    3. private UserService userServiceImpl1;

    方式二:

    1. // 方式二:配合@Qualifier注解来显式指定name值
    2. @Autowired
    3. @Qualifier(value = "userServiceImpl1")
    4. private UserService userService;

    @Resource注解的使用

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

    举例:

    1. @Service
    2. public class UserServiceImpl1 implements UserService
    3. @Service
    4. public class UserServiceImpl2 implements UserService
    1. @Resource
    2. private UserService userService;

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

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

    使用:对应4种情况

    1. // 1. 默认方式:byName
    2. @Resource
    3. private UserService userDao;
    4. // 2. 指定byName
    5. @Resource(name="userService")
    6. private UserService userService;
    7. // 3. 指定byType
    8. @Resource(type=UserService.class)
    9. private UserService userService;
    10. // 4. 指定byName和byType
    11. @Resource(name="userService",type=UserService.class)
    12. private UserService userService;
    1. 既没指定name属性,也没指定type属性:默认通过byName方式注入,如果byName匹配失败,则使用byType方式注入(也就是上面的那个例子)
    2. 指定name属性:通过byName方式注入,把变量名和IOC容器中的id去匹配,匹配失败则报错
    3. 指定type属性:通过byType方式注入,在IOC容器中匹配对应的类型,如果匹配不到或者匹配到多个则报错
    4. 同时指定name属性和type属性:在IOC容器中匹配,名字和类型同时匹配则成功,否则失败

  • 相关阅读:
    匿名用户上传的Mybatis学习笔记,炸来了阿里P8,网上一片好评
    OFDM 十六讲8 Nyquist Zero ISI Theorem
    PPT文件不能编辑的情况总结
    Rust检查一个Vec<String>是否包含一个特定的子字符串
    JAVA毕业设计web硕士研究生招生考试专业报考查询及学习系统设计与实现计算机源码+lw文档+系统+调试部署+数据库
    error: #20: identifier “PWMC_Handle_t“ is undefined
    enum枚举的使用
    如果员工因为管理者而辞职,为什么不解雇管理者呢?
    git常见操作
    ChatGPT,AIGC 助力人力资源管理对身份证号处理
  • 原文地址:https://blog.csdn.net/weixin_70280523/article/details/134297961