Spring五大类注解 || Bean的更简单存储

news2024/11/17 23:31:28

目录

前言:

五大类注解

@Controller

@Service

@Repository

@Component

@Configuration

JavaEE标准分层

阿里分层结构

BeanName命名规则

方法注解

@Bean

注入方式取Bean

属性注入

Setter注入

构造方法注入

@Resource


前言:

    使用Spring容器,为我们程序开发带来了很大的遍历。那么我们就需要学习Spring带来的一些机制,灵活的使用和理解这些机制,相信会有很多收获。

五大类注解

@Controller

    控制器,验证用户请求数据的正确性(安保系统)。直接和前端打交到,验证前端发来请求是否正确。

@Service

    服务,编排和调度具体执行方法的(客服中心)。不会直接操作数据库,根据请求判断具体调用哪个方法。

@Repository

    数据持久层,直接和数据库交互(执行者)(DAO层 data access object)

@Component

    组件(工具类)。为整个项目存放一些需要使用的组件,放在其他位置不是很合适。

@Configuration

    配置项(项目中的一些配置)。当项目启动时,如果遇到哪个类被这个注解修饰,那么就会加载其中的一些配置。

注意:

    1)上述五大类注解,xml配置的路径中只要能查找到(递归查询),其所修饰的类都会作为bean存储到spring中(类名需不同)。当然如果没有上述五大类注解那么当前类是不能作为bean存储到spring中的。

    2)五大类注解存在不同含义,当我们看到某一个注解就可以明确这个了类是做什么的。

    3)除了Component以外的其他四大类注解,都有Component注解的功能,也就是它的扩展。(看源码可发现其他四大类注解上面都有@Component注解)。

JavaEE标准分层

阿里分层结构

注意:阿里分层结构是对JavaEE标准分层在服务层(Service)做了一个扩展。

BeanName命名规则

注意:

    逐级向下看源码,发现Spring中使用的jdk中的方法来作为BeanName的命名规则。

    1)默认是第一个字母小写。

    2)如果前两个字母的大写,即BeanName就是原类名。

方法注解

@Bean

注意:

    1)可以将方法的返回值添加到spring中。

    2)方法注解必须搭配类注解使用,spring不会扫描所有类的方法,只扫描类注解下的方法(提升效率)

    3)@Bean的命名规则,默认是方法名,也可以起多个名字(name属性),这个时候默认的名字就无效了

    4)控制注入顺序(@Order注解)值越大,注入越迟,是类注解。如果对象一样,名字也一样(覆盖式注入)

注入方式取Bean

@Autowired

属性注入

    属性注入(spring会自动的将spring对象注入到@Autowired修饰的属性这里)

    根据类型和名字(spring中的对象Id),来确定唯一的一个对象,

优点:

    使用非常简单,只需要在属性上加@Autowired注解即可。

缺点:

    1)无法实现final修饰的变量注入

    2)兼容不好,只适用于IoC容器

    3)风险:因为写法简单,所以违背单一设计原则概率更大(可以注入多个对象,使用多个属性)

Setter注入

    Setter注入(使用set方法,spring会将对象传入到set方法中)(根据类名和对象名来确定)

优点:

    符合单一设计原则(每个方法只能传递一个对象)

缺点:

    1)不能注入不可变对象(final修饰)

    2)使用Setter注入的对象可能会被修改(可以调用set方法进行修改参数)

构造方法注入

    构造方法注入(官方推荐的做法),使用构造方法。

    如果只有一个构造方法,可以省略@Autowired,有多个构造方法就不能省略了。

优点:

    1)可以注入不可变对象(final修饰的)。

    2)注入的对象不会改变,构造方法只执行一次。

    3)构造方法可以保证对象完全被初始化(类加载时就会执行)。

    4)通用性更好。

提出问题:

    为什么构造方法可以注入不可变的对象而Setter和属性注入却不可以呢?

    答:final修饰的对象需要直接赋值或者在构造方法里进行初始化。类加载过程中就会执行构造方法,那么就可以初始化final修饰的对象。而Setter注入和属性注入是spring实现的,执行时机在类加载之后,所以就不能修改final修饰的对象。

@Resource

    使用JDK 提供的的@Resource注解也可以实现对象的注入。

注意:

    1)出身不同:@Autowired 来自于 Spring,而@Resource 来自于 JDK 的注解

    2)使用时设置的参数不同:相比于 @Autowired 来说,@Resource ⽀持更多的参数设置,例如name 设置,根据名称获取 Bean。

    3)@Autowired 可用于 Setter 注入、构造函数注⼊和属性注入,而@Resource 只能用于 Setter 注入和属性注入,不能用于构造函数注入

    4)@Autowired先根据类型查找,之后再根据名称查找。

    5)@Resource先根据名称查找,再根据类型查找。

小结:

    使用五大类注解和Bean的更简单存储可以快速提升我们开发的效率,学习框架我们要理解框架的本质作用。

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

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

相关文章

Linux-驱动开发-基础温习

一、裸机开发和驱动开发的区别: 裸机开发:底层(相对于linux来说),库 二、linux驱动开发-根据各种框架进行开发 1、 外设比较多,资源多,资料非常少,官方的SDK;直接操作寄存器不显示…

Python 基础(十):元组

❤️ 博客主页:水滴技术 🌸 订阅专栏:Python 入门核心技术 🚀 支持水滴:点赞👍 收藏⭐ 留言💬 文章目录 一、声明元组二、访问元组三、修改元组变量四、遍历元组五、切片六、常用函数和方法6.…

SpringBoot实现导出Excel功能

1 问题背景 需求要做一个导出excel的功能 2 前言 本篇着重阐述后端怎么实现,前端实现的部分只会粗略阐述。该实现方案是经过生产环境考验的,不是那些拿来练手的小demo。本文阐述的方案可以借鉴用来做毕设或者加到自己玩的项目中去。 3 实现思路 后端查询…

103. 二叉树的锯齿形层序遍历【191】

难度等级:中等 上一篇算法: 104. 二叉树的最大深度【75】 力扣此题地址: 103. 二叉树的锯齿形层序遍历 - 力扣(Leetcode) 1.题目:103. 二叉树的锯齿形层序遍历 给你二叉树的根节点 root ,返回其…

p65 内网安全-域环境工作组局域网探针方案

数据来源 基本概念 DMZ区域:称为“隔离区”,也称‘’非军事化区/停火区” 工作组(Work Group)是局域网中的一个概念。它是最常见最简单最普通的资源管理模式,就是将不同的电脑按功能分别列入不同的组中,以…

完美解决丨except NameError:

示例如下: try: print(xx) except: print(xx is not defined) print(continue) 解决办法 第一种解决办法: try: print(xx) except NameError: print(xx is not defined) print(continue) 第二种解决办法: print(xx) if xx in locals() e…

camunda工作流user task如何使用

在Camunda中使用User Task通常需要以下步骤: 1、创建User Task:使用BPMN 2.0图形化设计器(如Camunda Modeler),将User Task元素拖到流程图中,并为任务命名,指定参与者(用户或用户组…

第二章 Maven 核心程序解压和配置

第一节 Maven核心程序解压与配置 1、Maven 官网地址 首页: Maven – Welcome to Apache Maven(opens new window) 下载页面: Maven – Download Apache Maven(opens new window) 下载链接: 具体下载地址:https://dlcdn.apac…

算法:(力扣)(牛客)打印螺旋矩阵题

手撕螺旋矩阵 题目思路解题 题目 描述:给定一个m x n大小的矩阵(m行,n列),按螺旋的顺序返回矩阵中的所有元素。数据范围:0 \le n,m \le 100≤n,m≤10,矩阵中任意元素都满足 |val| \le 100∣val…

makefile 规则的覆盖

makefile 中经常会使用规则的覆盖,同样一个target 可能有多个prerequisites,这种依赖关系可以放到一起,也可以分开指定。 例1: test1:echo "test111"test2:echo "test222"test3:echo "test333"he…

vsync-app 不稳定导致抖动

问题描述:跟对比机器对比uc 浏览器新闻页滑动场景,出现抖动 1、trace 看是没有丢帧,对比看送帧buffer 给到 SF 步调不够一致,从间隔较大的两个 送帧buffer看,发现vsync-app 时间比正常的要长3ms 左右,vsync…

网络交换机端口管理工具

如今,企业或组织级网络使用数百个交换机端口作为其 IT 基础架构的一部分来实现网络连接。这使得交换机端口管理成为日常网络管理任务的一部分。传统上,网络管理员必须依靠手动网络交换机端口管理技术来跟踪交换机及其端口连接状态。这种手动任务弊大于利…

基于斯坦福大学开源,从零搭建chatGPT

下载地址: https://huggingface.co/datasets/togethercomputer/RedPajama-Data-1T 预处理仓库:https://github.com/togethercomputer/RedPajama-Data 复刻ChatGPT!斯坦福等开启红睡衣计划,开源1.2万亿token训练集 【新智元导读…

JAVA队列(Queue)用法附实例讲解

队列是什么 队列用于模拟队列这种数据结构,队列通常是指“先进先出”的容器。新元素插入(offer)到队列的尾部,访问元素(poll)操作会返回队列头部的元素。通常,队列不允许随机访问队列中的元素 …

【JavaWeb】Servlet(崔老师版)

文章目录 1.概述1.1 JavaWeb三大组件1.2 Servlet作用 2.ServletConfig接口3.Servlet接口3.1 实现Servlet的方式3.2 Servlet生命周期 4.HttpServlet抽象类6.ServletContext5.1 概述5.2 获取ServletContext5.3 JavaWeb四大域对象5.4 获取应用初始化参数5.5 ServletContext获取资源…

【UML建模】时序图(Sequence Diagram)

文章目录 1.概述2.时序图的组成元素2.1.角色(Actor)2.2.实体和对象2.3.生命周期线(Lifeline)2.3.1.激活(Activation)2.3.2.消息(Messages)2.3.3.组合片段(Fragments&…

learn C++ NO.1——命名空间域、输入输出、函数重载

前言 什么是C C(c plus plus)是一种计算机高级程序设计语言,由C语言扩展升级而产生,最早于1979年由本贾尼斯特劳斯特卢普在AT&T贝尔工作室研发。C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的…

Cache存储系统详解(全相联映射、直接映射、组相联映射、替换策略和性能计算)

1. 存储系统的层次结构 为了解决容量、速度和价格之间的矛盾,把各种不同存储容量,不同存取速度,不同价格的存储器,按照一定的体系结构组织起来,使所存放的程序和数据按层次分布在各存储器中,形成---多层次的…

读书笔记//《数据科学工程实践》

出版时间:2021年11月 副标题:用户行为分析、A/B实验、SQLFlow 作者们是一线互联网企业的数据科学家、数据分析师和算法工程师,主要就职于滴滴、部分就职于腾讯、快手等。 点评:神仙下凡布道。感谢大佬们的分享。本书让我领略了大厂…

小白也能看懂,解读数据中台

不同的企业对数据有不同的需求。企业数据应用不断更新迭代,企业的中台系统也需要不断变化。从数据处理与数据治理两个维度出发,可以设计一个解耦的数据中台体系架构。该数据中台体系架构具有一定的柔性,可按照企业应用需求进行组合&#xff0…