@Resource注解实现注入

@Resource注入

@Resource注解也可以完成属性注入。那它和@Autowired注解有什么区别?

  • @Resource注解是JDK扩展包中的,也就是说属于JDK的一部分。所以该注解是标准注解,更加具有通用性。(JSR-250标准中制定的注解类型。JSR是Java规范提案。)

  • @Autowired注解是Spring框架自己的。

  • @Resource注解默认根据名称装配byName,未指定name时,使用属性名作为name。通过name找不到的话会自动启动通过类型byType装配。

  • @Autowired注解默认根据类型装配byType,如果想根据名称装配,需要配合@Qualifier注解一起用。

  • @Resource注解用在属性上、setter方法上。

  • @Autowired注解用在属性上、setter方法上、构造方法上、构造方法参数上。

@Resource注解属于JDK扩展包,所以不在JDK当中,需要额外引入以下依赖:【如果是JDK8的话不需要额外引入依赖。高于JDK11或低于JDK8需要引入以下依赖。

    
<dependency>    <groupId>jakarta.annotation</groupId>    <artifactId>jakarta.annotation-api</artifactId>    <version>2.1.1</version></dependency>

源码:

    
package jakarta.annotation;
import java.lang.annotation.ElementType;import java.lang.annotation.Repeatable;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Repeatable(Resources.class)public @interface Resource { String name() default "";
String lookup() default "";
Class<?> type() default Object.class;
Resource.AuthenticationType authenticationType() default Resource.AuthenticationType.CONTAINER;
boolean shareable() default true;
String mappedName() default "";
String description() default "";
public static enum AuthenticationType { CONTAINER, APPLICATION;
private AuthenticationType() { } }}

①场景一:根据name注入

 

修改UserDaoImpl类

    
package com.atguigu.spring6.dao.impl;
import com.atguigu.spring6.dao.UserDao;import org.springframework.stereotype.Repository;
@Repository("myUserDao")public class UserDaoImpl implements UserDao {
@Override public void print() { System.out.println("Dao层执行结束"); }}

修改UserServiceImpl类

    
package com.atguigu.spring6.service.impl;
import com.atguigu.spring6.dao.UserDao;import com.atguigu.spring6.service.UserService;import jakarta.annotation.Resource;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.stereotype.Service;
@Servicepublic class UserServiceImpl implements UserService {
@Resource(name = "myUserDao") private UserDao myUserDao;
@Override public void out() { myUserDao.print(); System.out.println("Service层执行结束"); }}

测试通过

②场景二:name未知注入

 修改UserDaoImpl类

    
package com.atguigu.spring6.dao.impl;
import com.atguigu.spring6.dao.UserDao;import org.springframework.stereotype.Repository;
@Repository("myUserDao")public class UserDaoImpl implements UserDao {
@Override public void print() { System.out.println("Dao层执行结束"); }}

修改UserServiceImpl类

    
package com.atguigu.spring6.service.impl;
import com.atguigu.spring6.dao.UserDao;import com.atguigu.spring6.service.UserService;import jakarta.annotation.Resource;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.stereotype.Service;
@Servicepublic class UserServiceImpl implements UserService {
@Resource private UserDao myUserDao;
@Override public void out() { myUserDao.print(); System.out.println("Service层执行结束"); }}

测试通过 当@Resource注解使用时没有指定name的时候,还是根据name进行查找,这个name是属性名。

③场景三 其他情况

修改UserServiceImpl类,userDao1属性名不存在

    
package com.atguigu.spring6.service.impl;
import com.atguigu.spring6.dao.UserDao;import com.atguigu.spring6.service.UserService;import jakarta.annotation.Resource;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.stereotype.Service;
@Servicepublic class UserServiceImpl implements UserService {
@Resource private UserDao userDao1;
@Override public void out() { userDao1.print(); System.out.println("Service层执行结束"); }}

测试异常 根据异常信息得知:显然当通过name找不到的时候,自然会启动byType进行注入,以上的错误是因为UserDao接口下有两个实现类导致的。所以根据类型注入就会报错。@Resource的set注入可以自行测试

总结:

@Resource注解:默认byName注入,没有指定name时把属性名当做name,根据name找不到时,才会byType注入。byType注入时,某种类型的Bean只能有一个

相关推荐

  • 一名退休的亚马逊副总裁自述:高管与普通员工的脱节
  • 传鸿蒙系统明年将不兼容安卓;OpenAI 超 700 名员工联名逼宫董事会,不解散就跳槽微软|极客头条
  • 如果按代码量算工资,也许应该这样写!
  • 前端日历实现:公历、农历、黄历、星座、节气、天干、地支、八字、星宿、五行...
  • 改变axios的用法后,我的工作效率提升了3倍
  • 开源白板+AI:画出UI需求,自动获得代码
  • Spring Boot 3.x 最简集成 Spring Doc-OpenApi
  • Vite 5.0 正式发布,整了哪些活?
  • 请珍惜现在的工作机会
  • 被誉为 JavaScript 中 最难最常见 的手写题之一!!!
  • vue props的不规范使用破坏了props的单向数据流动
  • 15篇MyBatis-Plus系列集合篇「值得收藏学习」
  • 总结了十个Vue3超级实用但是很冷门的API
  • 11月24日,OC城市行·深圳站「操作系统与AI技术应用实践沙龙」邀你参与!
  • 99%的程序员容易忽视的“系统”健康问题
  • 纯CSS实现炫酷文本时钟
  • 和小伙伴们仔细梳理一下 Spring 国际化吧!从用法到源码!
  • 在农村,谁家孩子在华为、腾讯、阿里、字节上班,亲朋乡邻羡慕不已,年薪百万
  • 全新升级!Supabase 与 Next.js 14 的完美融合
  • 2024年不容错过的网站开发技术新趋势