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 {
    @Override
    public void run(ApplicationArguments args) throws Exception {
		System.out.println("我像一只鱼儿在你的荷塘");
    }
    
    @PreDestroy
    public void exit() {
        System.out.println("demo exit");
    }
}

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

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

public interface MyService {
    void doSomething();
}

@Service
public class ServiceOne implements MyService {
    @Override
    public void doSomething() {
        System.out.println("领导动动");
    }
}

@Controller
public class MyController {
    @Autowired
    private 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实例吗?

    @Autowired
    private 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 {
    @Override
    public void doSomething() {
        System.out.println("Service One is doing something");
    }
}

@Service("serviceTwo")
public class ServiceTwo implements MyService {
    @Override
    public 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.mfbz.cn/a/573455.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

分享:抖音阳哥说的人力RPO项目有哪些优势?

在数字化浪潮的推动下,人力资源行业也迎来了前所未有的变革。抖音平台上,阳哥以其独到的见解和丰富的经验,对人力RPO(招聘流程外包)项目进行了深入解读。今天,我们就来探讨一下人力RPO项目究竟有哪些优势。 人力RPO项目的一大优势…

get和post的区别?get不安全-post安全|面试官:好,你走吧

get和post的区别?get不安全-post安全|面试官:好,你走吧 开个小玩笑,面试官肯定是想知道更详细的内容,那面下面就是相对详细的内容,请收下吧(* ̄︶ ̄) 1、url可见性 get,参…

瀑布VS敏捷,看看哪种研发管理模式更适合你的团队

软件开发是一个复杂且极具挑战性的过程,需要有合适的研发管理模式。瀑布模型和敏捷开发是两种常见的研发管理模式,它们在项目管理和团队合作方面有着截然不同的理念和实践方式。本文将介绍这两种开发模式的特点、优缺点及对比,提供如何选择适…

【论文速读】|大语言模型(LLM)智能体可以自主利用1-day漏洞

本次分享论文: LLM Agents can Autonomously Exploit One-day Vulnerabilities 基本信息 原文作者:Richard Fang, Rohan Bindu, Akul Gupta, Daniel Kang 作者单位:无详细信息提供 关键词:大语言模型, 网络安全, 1-day漏洞, …

“我也想和月牙一样,把不满写在脸上”

贪吃蛇的初级实现 1. Win32 API介绍1.1 Win32 API1.2 控制台程序1.3 控制台屏幕上的坐标COORD1.4 GetStdHandle1.5 GetConsoleCursorInfo1.5.1 CONSOLE_CURSOR_INFO 1.6 SetConsoleCursorInfo1.7 SetConsoleCursorPosition1.8 GetAsyncKeyState 2. 贪吃蛇游戏设计与分析2.1 地图…

替换windows11 c:/windows/system32/下的dll

找到注册表中的这一项 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\icssvc\Settings 添加 WifiMaxPeers dword 值 32位 最大值是128 设置完成后重启icssvc服务 sc stop icssvc sc start icssvc 由于win11不小心装了preview版本,貌似这个8个最大的已经限定…

输入influx但是无法进入influxdb

问题描述: 博主想通过DockerJmeterInfluxDBGrafana搭建性能测试可视化平台,但是按照别的教程输入influx却无法进入inluxdb,输入输出如下: NAME:influx - Influx ClientUSAGE:influx [command]HINT: If you are looking for the I…

Cgicc搭建交叉编译环境(移植到arm)

Cgicc GUN Project官网连接:Cgicc- GNU Project - Free Software Foundation 1. 下载源码 Cgicc下载地址: [via http] Index of /gnu/cgicc [via FTP] ftp://ftp.gnu.org/gnu/cgicc/ 目前最新版:3.2.20 2. 源码构建原理 一般&#xff…

冰箱、保险柜门不要对准外面

风水真的和我们的生活息息相关,它会影响到我们的事业财运、婚姻感情、健康平安等等。很多人在不知情的情况下,触犯了风水里的禁忌,那结果可想而知! 峰民特别提示您:千万不要将冰箱、保险柜的门对准外面。冰箱是不能与…

虚拟化与Docker基本概念与Docker的安装

Docker Docker 是一个开源的应用容器引擎,它最初是用 Go 语言开发的。Docker 允许开发者将应用程序及其依赖、库和环境打包到一个可移植的容器中,这个容器可以在任何支持 Docker 的 Linux 或 Windows 机器上运行,保证了应用在不同环境之间的…

JdbcTemplate详解

1 概述 为了使JDBC更加易于使用,Spring在JDBC API上定义了一个抽象层,以此建立一个JDBC存取框架。 作为Spring JDBC框架的核心,JDBC模板的设计目的是为不同类型的JDBC操作提供模板方法,通过这种方式,可以在尽可能保留…

主食冻干哪个国家的好?全网热销款品控好的主食冻干必买

主食冻干哪个国家的好?谈及主食冻干哪款好,进口的主食冻干总是能被提名。不论是在哪个电商平台搜索“主食冻干”,都会发现那些备受推崇是进口主食冻干。从销售数据上看,这些进口冻干在大型促销活动如双11、618中的销量一直居高不下…

【面试题】java后端开发实习(含答案)

java后端开发实习生-常见面试题 1)JDK,JRE,JVM的关系 JDK JRE java开发工具JRE JVM java核心类库 2)String类的常用方法 1.关于字符串获取方面 length 获取长度charAt 获取指定索引的字符indexOf 获取字符所在的索引位置lastIndexOf 获取字符所在…

printjs打印表格的时候多页的时候第一页出现空白

现象:打印多页的时候第一页空白了,一页的时候没有问题 插件:printjs 网上搜索半天找到的方式解决: 1. 对于我这次的现象毫无作用。其他情况不得而知,未遇见过。(这个应该是大家用的比较多的方式&#xf…

像人脑一样工作!在量子计算机上运行强大的人工智能

内容来源:量子前哨(ID:Qforepost) 文丨王珩 浪味仙 排版丨沛贤 深度好文:2500字丨8分钟阅读 摘要:Transformer 确实可以在简单的量子硬件上工作,这至少从理论上表明:量子人工智能的…

库存数据可视化分析按这个做,赚大了!

今天我们来看一张库存数据可视化分析驾驶舱,全面了解库存资金占用情况,物料周转情况,库存趋势情况、以及占库存金额最高的商品有哪些等。 为更好地实现以上效果,并且增强报表的可读性、易读性,我们采用了按分析场景选…

Esko Ukkonen: On-line Construction of Suffix Trees

Esko Ukkonen: On-line Construction of Suffix Trees 文章目录 Esko Ukkonen: On-line Construction of Suffix Trees一、后缀树的概念及应用【详见刘方州同学报告】1.1 字典树 Trie1.2 后缀树 Suffix Tree2 后缀树的应用 二、朴素后缀树构造方法及问题三、线性时间内后缀树在…

使用 pytorch训练自己的图片分类模型

如何自己训练一个图片分类模型,如果一切从头开始,对于一般公司或个人基本是难以实现的。其实,我们可以利用一个现有的图片分类模型,加上新的分类,这种方式叫做迁移学习,就是把现有的模式知识,转…

【智能算法】金豺优化算法(GJO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2022年,N Chopra等人受到金豺狩猎行为启发,提出了金豺优化算法(Golden Jackal Optimization, GJO)。 2.算法原理 2.1算法思想 GJO 模拟金豺协同狩猎…

20240425在Ubuntu20.04下检测HDD机械硬盘

20240425在Ubuntu20.04下检测HDD机械硬盘 2024/4/25 14:28 百度:免费 HDD 机械硬盘坏道检测 ubuntu HDD机械硬盘 坏道检测 https://blog.csdn.net/anny0001/article/details/136001767 ubuntu 坏道扫描 Mystery_zero 已于 2024-02-02 22:20:46 修改badblocks -b 819…