spring boot中的标注@Component、@Service等

让我告诉你什么叫水货。

一、水货横行

一直以来,我对Spring Boot项目中的标注,像@Component啦、@Service啦、@Configuration啦,甚至@Autowired啦,等等,都似懂非懂。@Autowired与@Resource有什么区别也不清楚。

个中原因,一是本人资质愚钝,二是懒,所谓读书不求甚解,程序能编译、运行就可以,都是从网上、别人处抄过来的,为什么要加这些注解,不明觉厉,提不起兴趣做深入的了解。之前虽然也有搜寻过,但没有理解,只是简单地做个记录就完事。(springboot中依赖对象实例化问题)

所以说,虽然java用了好几年,其实并不怎么懂,是个水货,每次说自己是一个java程序员都不禁一阵心虚。

二、再认识一遍@Component、@Service等标注

为什么现在又查了一遍资料,学习一下这些标注,比较一下它们的异同呢?

原因是我发现,类头带上标注@Component,好像就会自动执行:

@Component
@Order(2)
public class Demo1 implements ApplicationRunner {@Overridepublic void run(ApplicationArguments args) throws Exception {System.out.println("我像一只鱼儿在你的荷塘");}@PreDestroypublic void exit() {System.out.println("demo exit");}
}

结果系统一启动,它就输出了:我像一只鱼儿在你的荷塘。好神奇哟!

难道@Component有这种魔力,可以让一个类自动运行?你看@Service就不会,我们写的服务实现类,都在头部加上@Service,但它不会自动执行,只能在别的什么地方通过@Autowired显式声明,然后调用才能运行。不主动调用就一动不动:

public interface MyService {void doSomething();
}@Service
public class ServiceOne implements MyService {@Overridepublic void doSomething() {System.out.println("领导动动");}
}@Controller
public class MyController {@Autowiredprivate MyService myService;public void performAction() {myService.doSomething();}
}

结果领导一动不动,像死了一样,除非触发了performAction()这个方法。

果真如此吗?

三、真相

1、真相1

事实并非如此。

@Component ,@Service , @Repository , @Controller , @Configration这些标注,放在类头,作用是使得Spring能够扫描到它们,在程序启动之初,就自动把它们实例化,将其注册为bean,放到spring容器中,从而可以被其他组件引用和使用。

其中,@Component ,@Service , @Repository,并不会自动运行;而@Configration会自动运行。在Spring框架中,当一个类被标记为@Configuration时,Spring除了会在应用启动时自动实例化这个类,还会运行其中的方法,用于创建和配置bean。这些bean定义方法通常使用@Bean注解来声明。

@Controller也算会自动运行。Spring会在应用启动时实例化带该标注的类,并将其注册为一个控制器,以便等待客户端的请求。

我前面的例子,@Component标注的类之所以会自动运行,可能是因为它实现了ApplicationRunner的缘故。

而@Service似乎是@Component的子类,跟@Component类似。

2、真相2

1)@Autowired

我一直以为,@Autowired的作用是实例化一个对象,你看下面,难道不是自动创建一个MyService实例吗?

    @Autowiredprivate MyService myService;

并不准确!@Autowired注解的作用是实现依赖注入。何谓依赖注入?就是一个对象里面,使用另一个对象。通常,我们手动写代码应用依赖注入,是将别的对象实例在构造函数或别的方法中作为参数传入。而有了@Autowired,就像普通属性一样声明,只要加上这个注解就可以了。简化了代码。依赖注入和实例化对象是不同的两个概念。当然啦,依赖注入时,用到的实例,应该就是Spring容器中实例化了的Bean。

上面代码的意思应该是,从容器中捞出实现了MyService的Bean,赋给变量myService;而不是系统临时自动new一个MyService实例,然后赋给myService,因为这个实例,早在系统启动的时候就已经new了,并且注册成bean放在了容器里。

2)@Resource和@Autowired

@Resource和@Autowired作用一样。二者的区别,一是@Resource来自于JEE,也可以用于Spring Boot;而@Autowired只能用于Spring Boot;二是@Resource可以通过name属性清晰地指向某个Bean,@Autowired可能要结合@Qualifier才可以。

@Resource:

public interface UserRepository {User findUserById(Long id);
}@Service("userRepositoryImpl")
public class UserRepositoryImpl implements UserRepository {// 实现...
}@Service
public class UserService {// 使用@Resource按名称装配,"userRepositoryImpl"对应于上面定义的Bean的名称@Resource(name = "userRepositoryImpl")private UserRepository userRepository;public User getUserById(Long id) {return userRepository.findUserById(id);}
}

@Autowired:

public interface MyService {void doSomething();
}@Service("serviceOne")
public class ServiceOne implements MyService {@Overridepublic void doSomething() {System.out.println("Service One is doing something");}
}@Service("serviceTwo")
public class ServiceTwo implements MyService {@Overridepublic void doSomething() {System.out.println("Service Two is doing something");}
}@Controller
public class MyController {// 默认按类型自动装配,由于有多个MyService的实现类,所以需要加上@Qualifier来明确指定@Autowired@Qualifier("serviceOne") // 按照@Bean的名称进行装配private MyService myService;public void performAction() {myService.doSomething();}
}

3)Autowried的优点

就是降低复杂性。试想,手动依赖注入,每个类的构造函数都塞满了参数,你中有我,我中有你。看看之前C#的代码:

    public class CxService:ICxService{P.ICxService pService;R.ICxService rService;ICache cache;ICheck_Cx_MasterRepository check_Cx_MasterRepository;ICheck_Cx_DetailRepository detailRepository;IWordExportService exportService;public CxService(ICache cache,P.ICxService pService,R.ICxService rService,ICheck_Cx_MasterRepository masterRepository,ICheck_Cx_DetailRepository detailRepository,IWordExportService exportService){this.cache = cache;this.pService = pService;this.rService = rService;this.check_Cx_MasterRepository = masterRepository;this.detailRepository = detailRepository;this.exportService = exportService;}。。。
}

在这里插入图片描述

四、我的java技能

虽然我用java从2018年开始,到现在有6年了,但事实上一直用的都是Spring Boot。并且对Spring Boot也不熟悉,只会一些简单的应用,增删改查而已。

来,让我们重温一下,Spring Boot这一Java开发框架,其核心有三:
1)IoC容器,顾名思义是控制反转容器?又名Spring容器?作用就是将类自动实例化,注册成Bean,放到Ioc容器里。IoC的好处是省事,也许还节省资源;

2)上下文
建造者模式。看上去,@Autowired应该属于上下文的范畴。

3)Spring核心
工具类
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/1704.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LearnOpenGL(三)之GLSL

一、GLSL 着色器是使用一种叫GLSL的类C语言写成的。 着色器的开头总是要声明版本,接着是输入和输出变量、uniform 和main函数。每个着色器的入口点都是main函数,在这个函数中 我们处理所有的输入变量,并将结果输出到输出变量中。 二、数据…

2-Embedding例子:简单NN网络、迁移学习例子(glove语料预训练)

一、简单例子:构造简单NN网络生成Embedding 1、pytorch例子 2、tensorflow例子 # 1导入模块 import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Embedding import numpy as np# 2构建语料库 corpus[[…

Linux命令接着学习

which命令,找到各种命令程序所处在的位置 语法:which查找的命令 那么对于我们想查找其他类型文件所在的位置,我们可以用到find命令 find命令 选项为-name,表示按照文件名进行查找 find命令中通配符 find命令和前面rm命令一样&…

MT3023 歌词中找单词

1.暴力 10/12 #include <bits/stdc.h> using namespace std; int n; string a[10005]; int main() {cin >> n;for (int i 0; i < n; i)cin >> a[i];string ll;cin >> ll;for (int i 0; i < n; i){string u a[i];int num 0;int j 0;for (in…

解线性方程组——追赶法解三对角方程组 | 北太天元

一、问题描述 对于线性方程组 A x b , A ( b 1 c 1 a 2 b 2 c 2 ⋱ ⋱ ⋱ ⋱ ⋱ ⋱ a n − 1 b n − 1 c n − 1 a n b n ) , b ( f 1 f 2 ⋮ f n ) Axb,\quad A\begin{pmatrix}b_1&c_1&&&&\\a_2&b_2&c_2&&&\\&\ddots&\d…

CentOS 7安装、卸载MySQL数据库(一)

说明&#xff1a;本文介绍如何在CentOS 7操作系统下使用yum方式安装MySQL数据库&#xff0c;及卸载&#xff1b; 安装 Step1&#xff1a;卸载mariadb 敲下面的命令&#xff0c;查看系统mariadb软件包 rpm -qa|grep mariadb跳出mariadb软件包信息后&#xff0c;敲下面的命令…

mysql基础14——视图

视图 视图是一种虚拟表 可以把一段查询语句作为视图存储在数据库中 需要的时候把视图看作一个表&#xff0c;对里面的数据进行查询 视图并没有真正存储数据 避免了数据存储过程中可能产生的冗余 提高了存储的效率 子查询 嵌套在另一个查询中的查询 派生表 如果在查询中…

六、项目发布 -- 4. 电子书详情页API开发、电子书列表API开发

电子书详情页API的编写 同理如下app.get中路由、回调&#xff1b;回调中要连接数据库、接收前端传过来的值、到数据库中做查询&#xff0c;然后回调&#xff08;如果回调失败返回什么JSON&#xff0c;如果回调成功返回什么JSON&#xff09;&#xff1b;最后千万别忘记了关闭数…

怎样快速打造二级分销小程序

乔拓云是一个专门开发小程序模板的平台&#xff0c;致力于帮助商家快速上线自己的小程序。通过套用乔拓云提供的精美模板&#xff0c;商家无需具备专业的技术背景&#xff0c;也能轻松打造出功能齐全、美观大方的小程序。 在乔拓云的官网&#xff0c;商家可以免费注册账号并登录…

全科都收!1区毕业水刊,影响因子狂涨至9.8,无预警记录!国人评价高!

本期&#xff0c;小编给大家解析的是一本创刊于2014年&#xff0c;且于同年被WOS数据库收录的毕业“水刊”——SCIENTIFIC DATA。 截图来源&#xff1a;期刊官网 SCIENTIFIC DATA&#xff08;ISSN&#xff1a;2052-4463&#xff09;是一本致力于数据的开放获取期刊&#xff0c…

可视化大屏在政务领域应用非常普遍,带你看看

可视化大屏在政务领域的应用非常普遍&#xff0c;政务领域需要处理大量的数据和信息&#xff0c;通过可视化大屏可以将这些数据以直观、易懂的方式展示出来&#xff0c;帮助政府决策者和工作人员更好地了解和分析数据&#xff0c;从而做出更准确、科学的决策。 在政务领域&…

xhEditor实现WORD粘贴图片自动上传

1.下载示例&#xff1a; 从官网下载 http://www.ncmem.com/webapp/wordpaster/versions.aspx 从gitee中下载 https://gitee.com/xproer/wordpaster-php-xheditor1x 2.将插件目录复制到项目中 3.引入插件文件 定义插件图标 初始化插件&#xff0c;在工具栏中添加插件按钮 效果…

B端界面:除了蓝色外,四条搞定清新明快的界面设计。

一、什么是清新明快风格 清新明快的设计风格是指在B端系统中使用明亮、清淡的色彩、简洁的布局和自然元素&#xff0c;以及轻快的动效&#xff0c;营造出轻松、愉悦的界面氛围。 二、哪些行业适用 这种设计风格适用于多个行业&#xff0c;特别是那些与创意、娱乐、健康、旅游…

安卓原生项目工程结构说明

.gradle 和 .idea (自动生成) .gradle 是gradle下载好的缓存&#xff0c;如果有配置好的 下载好的缓存 直接会拿来用 没有会下载 生成 .idea 是编辑器的配置 app 代码主逻辑 目录 项目中的代码 资源都会在里面 工作的时候的核心目录 gradle 下载安卓的构建器gradle相关的配置信…

V23092-A1024-A301 工业继电器 24V 6A 一组转换

V23092-A1024-A301是一款通用继电器。参数为24V 6A 该继电器适用于控制各种电气负载&#xff0c;如电机、加热器或其他高电流设备。广泛应用于各种工业控制和自动化系统中&#xff0c;它的封装尺寸和引脚排列符合标准的工业规范&#xff0c;便于安装和使用。 产品种类: 通用…

C语言——贪吃蛇游戏的实现

一. 贪吃蛇的介绍 我们都有玩过一个小游戏——贪吃蛇&#xff0c;贪吃蛇也是一个经典游戏。如上图所示&#xff0c;游戏玩法就是操控一个蛇&#xff0c;让它吃掉食物&#xff0c;每吃掉一个食物就会增加自己身体一格长度&#xff0c;并且保证自己不能撞到墙和自己本身&#xff…

Ubuntu系统安装Anaconda

1. 下载Anconda安装包 1.1 wget命令下载 当然还可以去清华大学开源软件镜像站&#xff1a;Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror&#xff0c;下载各种版本的Anaconda。 wget下载命令如下&#xff1a; 我这里下载的是2024.02…

二百三十三、Flume——Flume采集JSON文件到Kafka,再用Flume采集Kafka数据到HDFS中

一、目的 由于使用了新的Kafka协议&#xff0c;因为根据新的协议推送模拟数据到Kafka中&#xff0c;再Flume采集Kafka数据到HDFS中 二、技术选型 &#xff08;一&#xff09;Kettle工具 准备使用Kettle的JSON input控件和Kafka producer控件&#xff0c;但是搞了1天没搞定&…

OSPF的LSA详解

一、什么是LSA&#xff1f;LSA作用&#xff1f; 在OSPF协议中&#xff0c;LSA全称链路状态通告&#xff0c;主要由LSA头部信息&#xff08;LSA摘要&#xff09;和链路状态组成。部分LSA只有LSA头部信息&#xff0c;无链路状态信息。使用LSA来传递路由信息和拓扑信息&#xff0c…

【STM32F4】STM32CUMX相关环境配置

一、环境配置 我们需要以下两个软件 &#xff08;一&#xff09;keil5 最正统&#xff0c;最经典的嵌入式MCU开发环境。 该环境的配置可以看看之前的文章 所需文件如下&#xff1a; 当时配置的是STC8H的环境&#xff0c;现在基于此&#xff0c;重新给STM32配置环境。能让STC…