理解@Component 和 @Bean/@Autowire 和 @Resource 的区别

使用@Component时再使用@Resource或@Autowired时注入失败问题 在使用@Component注解将bean实例化到spring容器内的时候,@Autowired是在这个bean之中的,@Autowired还未完成自动装载,所以导致service为null。最近在写java项目时发现在使用了@Component的类同时使用@Autowired自动注入service或者mapper的时候发现并未注入成功,得到的对象是null.@Autowired注解放在方法上会在类加载后自动注入这个方法的参数,并执行一遍方法。 阅读详情

1. @Component 和 @Bean 的区别是什么?

  1. 作用对象不同:@Component 注解作用于类,而 @Bean 注解作用于方法、
  2. @Component 通常是通过路径扫描来自动侦测以及自动装配到 Spring 容器中(我们可以使用 @ComponentScan 注解定义要扫描的路径从中找出标识了需要装配的类自动装配到 Spring 的 bean 容器中)。@Bean 注解通常是我们在标有该注解的方法中定义产生这个 bean,@Bean 告诉了 Spring 这是某个类的实例,当我们需要用它的时候还给我。
  3. @Bean 注解比 @Component 注解的自定义性更强,而且很多地方我们只能通过 @Bean 注解来注册 bean。比如当我们引用第三方库中的类需要装配到 Spring 容器时,只能通过 @Bean 来实现。

@Bean 注解使用示例:

@Configuration
public class AppConfig {
    @Bean
public TransferService transferService() {
return new TransferServiceImpl();
    }
}

@Component 注解使用示例:

@Component
public class ServiceImpl implements AService {
    ....
}

下面这个例子是通过 @Component 无法实现的:

@Bean
public OneService getService(status) {
case (status)  {
when 1:
return new serviceImpl1();
when 2:
return new serviceImpl2();
when 3:
return new serviceImpl3();
    }
}

2. @Autowire 和 @Resource 的区别

  1. @Autowire 和 @Resource都可以用来装配bean,都可以用于字段或setter方法。
  2. @Autowire 默认按类型装配,默认情况下必须要求依赖对象必须存在,如果要允许 null 值,可以设置它的 required 属性为 false。
  3. @Resource 默认按名称装配,当找不到与名称匹配的 bean 时才按照类型进行装配。名称可以通过 name 属性指定,如果没有指定 name 属性,当注解写在字段上时,默认取字段名,当注解写在 setter 方法上时,默认取属性名进行装配。
注意:如果 name 属性一旦指定,就只会按照名称进行装配。

@Autowire和@Qualifier配合使用效果和@Resource一样:

@Autowired(required = false) @Qualifier("example")
private Example example;

@Resource(name = "example")
private Example example;

@Resource 装配顺序

  1. 如果同时指定 name 和 type,则从容器中查找唯一匹配的 bean 装配,找不到则抛出异常;
  2. 如果指定 name 属性,则从容器中查找名称匹配的 bean 装配,找不到则抛出异常;
  3. 如果指定 type 属性,则从容器中查找类型唯一匹配的 bean 装配,找不到或者找到多个抛出异常;
  4. 如果不指定,则自动按照 byName 方式装配,如果没有匹配,则回退一个原始类型进行匹配,如果匹配则自动装配。

3. 将一个类声明为 Spring 的 bean 的注解有哪些?

  • @Component :通用的注解,可标注任意类为 Spring 的组件。如果一个 Bean 不知道属于哪个层,可以使用 @Component 注解标注。
  • @Repository :对应持久层即 Dao 层,主要用于数据库相关操作。
  • @Service :对应服务层,主要设计一些复杂的逻辑,需要用到 Dao 层。
  • @Controller :对应 Spring MVC 控制层,主要用来接受用户请求并调用 Service 层返回数据给前端页面。
  • @Configuration :声明该类为一个配置类,可以在此类中声明一个或多个 @Bean 方法。

4. @Configuration :配置类注解

@Configuration 表明在一个类里可以声明一个或多个 @Bean 方法,并且可以由 Spring 容器处理,以便在运行时为这些 bean 生成 bean 定义和服务请求,例如:

@Configuration
public class AppConfig {

    @Bean
public MyBean myBean() {
// instantiate, configure and return bean ...
    }
}

我们可以通过 AnnotationConfigApplicationContext 来注册 @Configuration 类:

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(AppConfig.class);
ctx.refresh();
MyBean myBean = ctx.getBean(MyBean.class);
// use myBean ...

另外也可以通过组件扫描(component scanning)来加载,@Configuration 使用 @Component 进行原注解,因此 @Configuration 类也可以被组件扫描到(特别是使用 XML 的 元素)。@Configuration 类不仅可以使用组件扫描进行引导,还可以使用 @ComponentScan 注解自行配置组件扫描:

@Configuration
@ComponentScan("com.acme.app.services")
public class AppConfig {
// various @Bean definitions ...
}

使用 @Configuration 的约束:

  • 配置类必须以类的方式提供(比如不能是由工厂方法返回的实例)。
  • 配置类必须是非 final 的。
  • 配置类必须是非本地的(即可能不在方法中声明),native 标注的方法。
  • 任何嵌套的配置类必须声明为 static。
  • @Bean 方法可能不会反过来创建更多的配置类。

除了单独使用 @Configuration 注解,我们还可以结合一些外部的 bean 或者注解共同使用,比如 Environment API,@PropertySource,@Value,@Profile 等等许多,这里就不做详细介绍了,更多的用法可以参看 Spring @Configuration 的相关文档 。

5. @ControllerAdvice :处理全局异常利器

在 Spring 3.2 中,新增了 @ControllerAdvice、@RestControllerAdvice、@RestController 注解,可以用于定义 @ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有 @RequestMapping 、@PostMapping、@GetMapping等这些 Controller 层的注解中。默认情况下,@ControllerAdvice 中的方法应用于全局所有的 Controller。而使用选择器 annotations(),basePackageClasses() 和 basePackages() (或其别名value())来定义更小范围的目标 Controller 子集。如果声明了多个选择器,则应用 OR 逻辑,这意味着所选的控制器应匹配至少一个选择器。请注意,选择器检查是在运行时执行的,因此添加许多选择器可能会对性能产生负面影响并增加复杂性。@ControllerAdvice 我们最常使用的是结合 @ExceptionHandler 用于全局异常的处理。可以结合以下例子,我们可以捕获自定义的异常进行处理,并且可以自定义状态码返回:

@ControllerAdvice("com.developlee.errorhandle")
public class MyExceptionHandler {
    /**
     * 捕获CustomException
     * @param e
     * @return json格式类型
     */
    @ResponseBody
    @ExceptionHandler({CustomException.class}) //指定拦截异常的类型
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) //自定义浏览器返回状态码
    public Map>String, Object< customExceptionHandler(CustomException e) {
        Map&lt;String, Object&gt; map = new HashMap&lt;&gt;();
map.put("code", e.getCode());
map.put("msg", e.getMsg());
return map;
    }
}

更多信息可以参看 Spring @ControllerAdvice 的官方文档。

6. @Component, @Repository, @Service 的区别

 

@Component是一个通用的Spring容器管理的单例bean组件。而@Repository, @Service, @Controller就是针对不同的使用场景所采取的特定功能化的注解组件。因此,当你的一个类被@Component所注解,那么就意味着同样可以用@Repository, @Service, @Controller 来替代它,同时这些注解会具备有更多的功能,而且功能各异。最后,如果你不知道要在项目的业务层采用@Service还是@Component注解。那么,@Service是一个更好的选择。

【@Component和@Bean的区别?】 @Component和@Bean注解都是Spring框架中用于注册Bean的注解,但它们在使用方式、自定义性、适用场景等方面存在明显的区别。@Component注解适用于普通的Java类,通过类路径扫描来自动侦测和装配;而@Bean注解则提供了更多的配置灵活性,适用于需要手动配置和管理的Bean。在实际开发中,根据具体的需求和场景选择合适的注解,可以更好地利用Spring框架的功能。 阅读详情

相关推荐

spring框架的@Resource和@Component 程序和文档

spring框架的@Resource和@Componentspring框架的@Resource和@Component

@Bean和@Component

@Bean和@Component都是用于创建一个bean实例. 区别于@Component只能定义bean名称,且只能用于类上 //只能用于类上 @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Indexed public @interface Component { /** * The value may indicate a suggestion for a logical component

as513385的博客 3658

地理空间坐标系统-不同椭球基准间的坐标转换

基于同一个椭球基准,可以构建三类地理空间坐标系:大地球面坐标系、大地空间直角坐标系、大地投影坐标系。由于坐标原点和椭球长短半径等都相同,这三类坐标系之间可以通过无损的数学方法相互之间进行转换。那么现在问题来了,不同椭球基准(在全球范围来看存在成百上千的椭球基准)之间的坐标怎么转换?比如,北京54、西安80、国家2000,特别是在我国,现在主推国家2000坐标系,那么如何将历史的测绘成果(北京54和...

技术改变世界 8336

@Component 和 @Bean 的区别

1、两者的联系和区别 @Component 和 @Bean 是两种使用注解来定义bean的方式。 @Component(和@Service和@Repository)用于自动检测和使用类路径扫描自动配置bean。注释类和bean之间存在隐式的一对一映射(即每个类一个bean)。 这种方法对需要进行逻辑处理的控制非常有限,因为它纯粹是声明性的。 @Bean用于显式声明单个bean,而不是...

悟鸣的技术博客 5万+

iTunes登录协议逆向与自动化实现

本文详细解析了iTunes登录协议的逆向工程与自动化实现方法,涵盖请求体构造、签名生成和会话管理等关键技术。通过XML结构解析、X-Apple-ActionSignature生成原理及完整登录流程实现,帮助开发者高效完成iTunes自动化登录,提升工作效率。

weixin_26938645的博客 938

海康工业相机SDK+OpenCV实战:图像采集与Mat格式转换优化指南

本文深入探讨了如何高效利用海康工业相机SDK与OpenCV进行图像采集与处理。重点解析了从相机RawData到OpenCV Mat格式转换的核心优化技巧,包括像素格式匹配、内存零拷贝管理以及彩色图像BGR/RGB转换,旨在解决工业应用中常见的性能瓶颈与内存问题,构建稳定高效的图像处理流程。

weixin_29192211的博客 107

一次性讲清 Spring 常用注解 @Bean 、 @Component 、@Autowire、@Resource 的区别, 你知道吗?

本文打算介绍几个不太容易说出其区别,或者用途的 Spring 注解,比如 @Component 与 @Bean 的比较,@ControllerAdvice 是如何处理自定义异常的等等。 Spring 中的一些注解 1. @Component 和 @Bean 的区别是什么? 作用对象不同:@Component 注解作用于类,而 @Bean 注解作用于方法、 @Component 通常是通过路径扫描来自动侦测以及自动装配到 Spring 容器中(我们可以使用 @ComponentScan 注解定义要扫描的路径

LoveSummer 4078

雷电模拟器+Google Play服务配置全指南:从安装到定位问题解决

本文详细介绍了雷电模拟器配置Google Play服务的全流程,包括版本选择、组件安装、定位服务调试及网络问题排查。针对安卓开发者的常见挑战,提供从基础到高级的解决方案,帮助优化测试环境稳定性与定位精度。

weixin_30399821的博客 1219

SpringBoot @bean和@component的区别

本文打算介绍几个不太容易说出其区别,或者用途的 Spring 注解,比如 @Component 与 @Bean 的比较,@ControllerAdvice 是如何处理自定义异常的等等。 1. @Component 和 @Bean 的区别是什么? 作用对象不同:@Component 注解作用于类,而 @Bean 注解作用于方法、 @Component 通常是通过路径扫描来自动侦测以及自动装配到 Spring 容器中(我们可以使用 @ComponentScan 注解定义要扫描的路径从中找出标识了需要装配的类自

私欲日生,如地上尘,一日不扫,便又有一层。着实用功,便见道无终穷,愈探愈深,必使精白无一毫不彻方可。 2247

RM机器人麦轮底盘实战:从零搭建到PID调参全记录(附避坑指南)

本文详细记录了RM机器人麦轮底盘从零搭建到PID调参的全过程,涵盖硬件组装、开发环境搭建、底盘解算和PID调参等关键步骤,并附有实用的避坑指南。特别针对麦轮控制、底盘解算和电机调试等核心问题提供了专业解决方案,帮助开发者快速提升机器人性能。

bush的博客 369

用UDP协议在dos命令行里模拟一个聊天程序

/* 需求: 在dos命令行里模拟一个聊天程序 有收数据的部分,和发数据的部分,这两部分需要同时执行。 那就需要用到多线程技术。 一个线程控制收,一个线程控制发。 */ import java.io.*; import java.net.*; class C

s_x_x的记录 1955

Spring 注解 @bean 和 @component 的区别, 你知道吗?

注:本文是对众多博客的学习和总结,可能存在理解错误。请带着怀疑的眼光,同时如果有错误希望能指出。 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的。所以先限定一下本文的上下文。 本文讨论的背景是Linux环境下的network IO。 一 概念说明 在进行解释之前,首先要说明几个概念: - 用户空间和内核空间 - 进程切换 - 进程的阻塞 - 文件描述符 - 缓存 I/O 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作.

LoveSummer 2482

电压电流双闭环PFC单相PWM整流

电压电流双闭环PFC单相整流。仿真及代码

xht2403267701的博客 6051

Spring注解中@Configuration、@Component、@Bean傻傻分不清

文章目录前言一、将一个类声明为 Spring 的 bean 的注解有哪些?二、@Component 和 @Configuration 注解的区别是什么?三、@Autowire 和 @Resource 注解的区别是什么?四、@Qualifier 和 @Primary 注解的区别是什么?总结 前言 嗨,大家好,我是希留。 近日,公司里一位实习的同事在看项目代码时发现有的类使用的是@Configuration注解,有的类使用的是@Component注解,有的地方使用的是@Bean注解,有的又是使用的@Auto.

Java升级之路的博客 3938

14 ABSOLUTE评估肿瘤纯度

14 ABSOLUTE评估肿瘤纯度 Absolute介绍 ABSOLUTE可以直接从体细胞突变和拷贝数变异的结果中推断肿瘤纯度和倍性的计算方法。 通常来说,我们取肿瘤组织进行测序,往往是一个混合样品,既包括肿瘤细胞也包括正常细胞,因此需要进行肿瘤纯度 purity 的评估。当从混合样品中提取 DNA 进行测序后,得到的也是一个混合样品的结果。肿瘤不一定是单纯的二倍体了,其本身异质性高,存在部分突变部分不突变的情况,直接分析拷贝数变异,得到的结果并不准确,评估肿瘤倍性 ploidy 也更加必要。而 ABSO

qq_23435961的博客 4213

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Spring注解比较,@bean和@component的区别

点击上方“Java基基”,选择“设为星标”做积极的人,而不是积极废人!每天14:00更新文章,每天掉亿点点头发...源码精品专栏原创 | Java 2021超神之路,很肝~中文详细...

weixin_44421461的博客 321

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Spring @bean 和 @component 注解有什么区别?

本文打算介绍几个不太容易说出其区别,或者用途的 Spring 注解,比如 @Component 与 @Bean 的比较,@ControllerAdvice 是如何处理自定义异常的等等。 Spring 中的一些注解 @Component 和 @Bean 的区别是什么? 作用对象不同:@Component 注解作用于类,而 @Bean 注解作用于方法、 @Component 通常是通过路径扫描来自动侦测以及自动装配到 Spring 容器中(我们可以使用 @ComponentScan 注解定义要扫描的路径从中找

m0_49496327的博客 202

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【096期】面试官:Spring 注解 @bean 和 @component 有什么区别?

点击上方“Java精选”,选择“设为星标”别问别人为什么,多问自己凭什么!下方留言必回,有问必答!每天08:08更新文章,每天进步一点点...本文打算介绍几个不太容易说出其区别,或者用...

Java精选 322

Spring 中的一些关于bean的注解

不知道理解正确不正确,只用于记录 @Component 和 @Bean 的区别 1.作用对象不同: @Component 注解作用于类,而 @Bean 注解作用于方法 2.@Component 通常是通过路径扫描来自动侦测以及自动装配到 Spring 容器中(我们可以使用 @ComponentScan 注解定义要扫描的路径从中找出标识了需要装配的类自动装配到 Spring 的 bean 容器中)。@Bean 注解通常是我们在标有该注解的方法中定义产生这个 bean,@Bean 告诉了 Spring 这是

weixin_42471125的博客 890

java面试题

案例2中new语句执行完以后,会创建两个对象,一个是字符串常量对象,会被字符串常量池引用,另一个是new的对象案例三第一行执行后,尚硅谷对象赋给s1,但是并不会存到字符串常量池中案例三如果换成jdk6就是另一种结果,即堆内存的尚硅谷和字符串常量池的尚硅谷不是一个对象关系是否合法说明抽象类implements接口✅ 合法抽象类可实现一个或多个接口接口extends接口✅ 合法接口可继承一个或多个接口抽象类extends接口❌ 非法必须改用implements接口。

2304_80073016的博客 322

spring的注解@Component、@Bean,@Autowire一遍搞定

一 spring注解的作用 1.1 作用 1.@Component:注解表明一个类会作为组件类,并告知Spring要为这个类创建bean,使用 @Component注解在一个类上,表示将此类标记为Spring容器中的一个Bean。(相当于创建对象) 2.@Bean是将组件注册到Bean,让IOC容器知道这个组件存在。(相当于创建对象) 3.@Autowire:是组件和组件相互调用的时候,自动从ioc中取出来需要用的组件。(调用对象) 比如Service,Control...

健康平安的活着的专栏 1万+

Spring注入容器-@Component和@Bean

1、@Bean和@Component都是将Spring Bean添加到Spring Context中。 2、@Bean不能注释在类上,只能作用于方法。 3、@Bean一般结合@Configuration一起使用 4、@Bean注解的方法名默认作为对象的名字 5、@Bean可以单独配置在类的方法中...

weixin_40017062的博客 2788

一文搞懂什么是@Component和@Bean注解以及如何使用

深入源码+实例讲解什么是@Component和@Bean以及如何使用

m0_51358164的博客 1万+
上一篇: SpringBoot和SpringCloud之间的关系
下一篇: SpringBoot项目实现更改代码后实时刷新问题
@百思不如奇解
博客等级 码龄5年 352粉丝 101原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@百思不如奇解

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值