Spring中@Autowired和@Resource的区别及详细使用

简介: Spring中@Autowired和@Resource的区别及详细使用

@Autowired是Spring提供的

@Resource是J2EE提供的


@Autowired:

获得对象的方式称之为byType(通过类型),如果需要指定名字,那么需要使@Qualifier(“bean的名字”)


在spring容器中寻找注解标定的类型的对象


1.没有任何类型匹配的对象-------------发生异常

2.有且只有一个匹配类型的对象-------注入成功

3.有两个以及两个以上匹配类型的对象

多个匹配类型对象中有匹配当前变量名为对象名称的 —注入成功

多个匹配类型对重中没有匹配当前变量名为对象名称的 —注入失败

@Autowired 默认第一按照byType(类的类型),第二byName(l类名\类ID)来加载类,所以当存在类型相同,多个beanname时,想注入某个类,就必须指定根据什么beanName查找,不用@Qualifier注解指定,则会以变量名为为beanName进行查找;



@Resource

获得对象的方式称之为byName(通过名称)


1.有和指定要获得的名称的对象匹配的Spring容器中的对象


类型也匹配,注入成功

类型不匹配,注入失败

2.没有和指定要获得的名称的对象匹配的Spring容器中的对象


如果有唯一一个类型匹配的对象,则注入成功

如果没有唯一匹配类型对象,则注入失败

示例代码:

@Service
public class UserService implements IUserService {
    public void query() {
        System.out.println("hello world");
    }
}
@Service("userService2")
public class UserService2 implements IUserService {
    @Override
    public void query() {
        System.out.println("hello code");
    }
}
//-----------------------------------------------------------------------------------
@Autowired
private IUserService userService;
@GetMapping(value = "/query")
public void test(){
    userService.query();
    // 输出:hello world。会以变量名为为beanName进行查找
}
@Autowired
@Qualifier(value = "userService2")
private IUserService userService;
@GetMapping(value = "/query")
public void test(){
    userService.query();
    // 输出:hello code
}
@Autowired
private IUserService userService2;
@GetMapping(value = "/query")
public void test(){
     userService2.query();
  //hello code
}
//-------------------------------------------------------------------------------
@Resource
private IUserService userService;
@GetMapping(value = "/query")
public void test(){
    userService.query();
    // hello world
}
@Resource(name = "userService")
private IUserService userService;
@GetMapping(value = "/query")
public void test(){
  userService.query();
  //hello world
}
@Resource
private IUserService userService2;
@GetMapping(value = "/query")
public void test(){
    userService2.query();
    //hello code
}
@Resource(name = "userService2")
private IUserService userService;
@GetMapping(value = "/query")
public void test(){
    userService.query();
    //hello code
}
@Resource(type = UserService2.class)
private IUserService userService2;
@GetMapping(value = "/query")
public void test(){
     userService2.query();
     //hello code
 }
@Resource(type = UserService2.class)
private IUserService entity;
@GetMapping(value = "/query")
public void test(){
     entity.query();
     //hello code
}
相关文章
|
Java 测试技术 程序员
为什么Spring不推荐@Autowired用于字段注入?
作为Java程序员,Spring框架在日常开发中使用频繁,其依赖注入机制带来了极大的便利。然而,尽管@Autowired注解简化了依赖注入,Spring官方却不推荐在字段上使用它。本文将探讨字段注入的现状及其存在的问题,如难以进行单元测试、违反单一职责原则及易引发NPE等,并介绍为何Spring推荐构造器注入,包括增强代码可读性和维护性、方便单元测试以及避免NPE等问题。通过示例代码展示如何将字段注入重构为构造器注入,提高代码质量。
558 1
|
负载均衡 Dubbo Java
Spring Cloud Alibaba与Spring Cloud区别和联系?
Spring Cloud Alibaba与Spring Cloud区别和联系?
|
Java 关系型数据库 数据库
京东面试:聊聊Spring事务?Spring事务的10种失效场景?加入型传播和嵌套型传播有什么区别?
45岁老架构师尼恩分享了Spring事务的核心知识点,包括事务的两种管理方式(编程式和声明式)、@Transactional注解的五大属性(transactionManager、propagation、isolation、timeout、readOnly、rollbackFor)、事务的七种传播行为、事务隔离级别及其与数据库隔离级别的关系,以及Spring事务的10种失效场景。尼恩还强调了面试中如何给出高质量答案,推荐阅读《尼恩Java面试宝典PDF》以提升面试表现。更多技术资料可在公众号【技术自由圈】获取。
|
监控 Java 应用服务中间件
Spring和Spring Boot的区别
Spring和Spring Boot的主要区别,包括项目配置、开发模式、项目依赖、内嵌服务器和监控管理等方面,强调Spring Boot基于Spring框架,通过约定优于配置、自动配置和快速启动器等特性,简化了Spring应用的开发和部署过程。
801 19
|
Java 编译器 Spring
Spring AOP 和 AspectJ 的区别
Spring AOP和AspectJ AOP都是面向切面编程(AOP)的实现,但它们在实现方式、灵活性、依赖性、性能和使用场景等方面存在显著区别。‌
712 2
|
XML 前端开发 Java
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
本文阐述了Spring、Spring Boot和Spring MVC的关系与区别,指出Spring是一个轻量级、一站式、模块化的应用程序开发框架,Spring MVC是Spring的一个子框架,专注于Web应用和网络接口开发,而Spring Boot则是对Spring的封装,用于简化Spring应用的开发。
4305 0
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
|
9月前
|
Java Spring 容器
SpringBoot自动配置的原理是什么?
Spring Boot自动配置核心在于@EnableAutoConfiguration注解,它通过@Import导入配置选择器,加载META-INF/spring.factories中定义的自动配置类。这些类根据@Conditional系列注解判断是否生效。但Spring Boot 3.0后已弃用spring.factories,改用新格式的.imports文件进行配置。
1308 0
|
10月前
|
人工智能 Java 测试技术
Spring Boot 集成 JUnit 单元测试
本文介绍了在Spring Boot中使用JUnit 5进行单元测试的常用方法与技巧,包括添加依赖、编写测试类、使用@SpringBootTest参数、自动装配测试模块(如JSON、MVC、WebFlux、JDBC等),以及@MockBean和@SpyBean的应用。内容实用,适合Java开发者参考学习。
1119 0
|
6月前
|
JavaScript Java Maven
【SpringBoot(二)】带你认识Yaml配置文件类型、SpringMVC的资源访问路径 和 静态资源配置的原理!
SpringBoot专栏第二章,从本章开始正式进入SpringBoot的WEB阶段开发,本章先带你认识yaml配置文件和资源的路径配置原理,以方便在后面的文章中打下基础
552 4
|
6月前
|
Java 测试技术 数据库连接
【SpringBoot(四)】还不懂文件上传?JUnit使用?本文带你了解SpringBoot的文件上传、异常处理、组件注入等知识!并且带你领悟JUnit单元测试的使用!
Spring专栏第四章,本文带你上手 SpringBoot 的文件上传、异常处理、组件注入等功能 并且为你演示Junit5的基础上手体验
1074 3
下一篇
开通oss服务