【Java】Spring ——用【注解】更快捷的存储 / 获取Bean对象

26 篇文章 4 订阅
订阅专栏


前言

本人是一个普通程序猿!分享一点自己的见解,如果有错误的地方欢迎各位大佬莅临指导,如果你也对编程感兴趣的话,互关一下,以后互相学习,共同进步。这篇文章能够帮助到你的话,劳请大家点赞转发支持一下!


一、存储 Bean 对象

在这里插入图片描述

上篇文章中,向Spring容器中添加对象,还要去配置文件里手动添加,这貌似并不比new便捷。

而Spring项目中呢,往往采用更加便捷的 “注解” 来向Spring容器中添加对象


类注解

要想将 对象存储到 Spring 中,一共有两种注解类型可以实现:

  • 类注解: @Controller、@Service、@Repository、@Component、@Configuration
  • 方法注解: @Bean。

为什么有五个类注解

类注解一共有五个,但是这五个类注解的功能可以说是一模一样。

那么功能一样,有一个不就好了,为什么还要有五个呢?

这其中的道理,就好像笔记本类型,有轻薄本,办公本,游戏本。
他们不也都是笔记本吗,为什么还要分成三种呢?
因为人们可以从这个类型就看出笔记本更适合干什么。
轻薄本,更加轻薄,便于携带。
办公本,更加适合办公。
游戏本,性能更强,适用于打游戏,与一些需要生产力的场景(视频渲染,建模等)。


所以为什么会有五个功能相同的类注解呢?
在一个项目的开发中,往往需要多名程序员协同开发,
而这五个类注解的目的就是为了让 程序员看到类注解,就能直接了解当前类的用途

  • @Controller:业务逻辑层,负责校验参数的合法性。
  • @Service:服务层,负责业务组装。
  • @Repository:数据持久层,负责实际业务处理。
  • @Configuration:配置层,负责存储配置类。
  • @Component:工具层,负责存储工具类。

在这里插入图片描述

查看 @Controller、@Service、@Repository、@Configuration 的源码可以发现,这些注解里面都有注解@Component,所以 这四个注解都是@Component的子类
在这里插入图片描述

  • 五个类注解功能相同,下面就只拿@Controller注解做例子讲解了!!!

使用类注解存储对象

配置扫描路径(重中之重)

在配置文件(这里我的配置文件是spring-config.xml)中,添加一行代码即可。

<content:component-scan base-package=""></content:component-scan>

此时Spring就 只会扫描这个路径对应的包中的注解,以及子包中有注解的类 ,并将注解类添加到容器中。

举例 在这里插入图片描述
我路径对应的包是test包,所以此时:
Spring
只会扫描test包中的类,以及test的子包 demo包中的类。

不会扫描与test包同级的School类,也不会扫描与test包同级的example包中的类。

扫描路径也是为了提升性能,在实际开发中,一个项目可能包含许多类,如果都扫描的话,那么就会影响性能,因此就有了扫描路径,只扫描该路径下的类。

  • 注意注意注意!!! 不在扫描路径的包中的类,即便是这个包上一级中的类,同级的类,同一级包中的类,即便添加了注解,也不会被存储到Spring容器中!!!!!!!!!!!
  • 可以配置多个扫描路径!!!Spring会同时将这些路径中的注解放到容器中。 在这里插入图片描述

添加注解存储 Bean 对象

五各类注解的使用方法相同,只拿@Controller注解做示范,想用其他注解,使用方法相同。

添加注解存储对象有两种方式:

注解中设置名字在这里插入图片描述
这个value相当于给注解设置名字,然后根据名字在容器中查找取出对象。
在这里插入图片描述
有两种设置名字的写法,这两种写法都一样。
在这里插入图片描述

注解中不给参数
此时就会根据类名来给你一个默认的名字。下面咱们看下给默认名字方法的源码。在这里插入图片描述
如果 类名的第一个字母与第二个字母都是大写 ,那么他的 默认名字是原类名
如果 类名的第一个字母与第二个字母有一个不是大写或都不是大写 ,那么他的 默认名字是首字母小写的类名

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


方法注解

配置扫描路径(重中之重)

上述类注解配置扫描路径,这一个扫描路径可以同时供类注解与方法注解使用,配置方法与类注解一致。


使用方法注解存储对象

类注解是添加到某个类上的,而方法注解是放到某个方法上的,如以下代码的实现。

方法注解的作用,就是将这个方法返回的对象存储到容器中。

拿下面两个类举例:
在这里插入图片描述在这里插入图片描述

方法注解有两点需要注意
1️⃣方法注解要搭配类注解使用。
不搭配类注解使用在这里插入图片描述> 在这里插入图片描述
可以看到不搭配类注解使用就会报错
Spring只会扫描添加了类注解的类 里面是否有方法注解。

搭配类注解使用在这里插入图片描述在这里插入图片描述

方法注解搭配类注解时,类注解同样生效,被类注解标记的类也会被存入容器中


2️⃣添加方法注解的方法不能有参数(任何类型的参数都不行)。
在这里插入图片描述
在这里插入图片描述


下面咱们就来讲一讲方法注解的命名吧!
在这里插入图片描述
方法注解@Bean,可以设置value与name设置哪个都行,都当名字用。
值得注意的是方法注解可以设置多个名字,当然也可以不设置名字。

不设置名字 在这里插入图片描述

在这里插入图片描述

设置一个名字 在这里插入图片描述
在这里插入图片描述

设置多个名字

在这里插入图片描述

在这里插入图片描述

  • 注意!!! 当你设置名字后,默认命名就失效了!!再用默认命名就会抛出异常
    在这里插入图片描述在这里插入图片描述

二、获取 Bean 对象

获取 bean 对象也叫做对象装配,是把对象取出来放到某个类中,有时候也叫对象注入。(是放到类里!!

对象装配(对象注入)的实现方法有以下 3 种

  • 属性注入
  • Setter注入
  • 构造方法注入

@Autowired

这三种方式都可以由注解@Autowired实现的,只是实现方式不同

下面就用IoC容器模拟实现一对一家教的老师分配学生的场景来讲解三种注入方法。
所需要用到的类,Student(代表一个学生),Students(学生表),Teacher(表示一个教师),App(启动类/测试类)
在这里插入图片描述

Student类在这里插入图片描述

Students类,通过方法注解@Bean将Student对象添加到IoC容器中。在这里插入图片描述

Teacher类,在里面通过给student变量注入对象来演示三种对象注入的方式。在这里插入图片描述


属性注入

使用示例:
Teacher类中的Student类型的student变量,就通过属性注入的方法,在IoC容器中注入了对象 在这里插入图片描述在这里插入图片描述
属性注入的工作原理就是通过你变量的类型,去IoC容器中找寻匹配的类型然后注入到对应的变量中!

BUG
假如IoC容器中有两个相同变量的类型,此时就会有BUG。
修改Students代码,让他向IoC容器中添加两个相同类型的对象。
在这里插入图片描述
在这里插入图片描述
解决方案1️⃣:使变量名与@Bean的名字相同。
在这里插入图片描述
解决方案2️⃣:@Autowired配合@Qualifier一起使用
在这里插入图片描述

属性注入的优缺点:
优点
使用简单。


缺点
1️⃣:无法注入final修饰的变量。在这里插入图片描述

2️⃣:通用性问题,只适用于IoC容器。
修改代码,Teacher类不在IoC容器中在这里插入图片描述在这里插入图片描述
此时就不会再进行属性注入了!

3️⃣:更容易违背单一设计原则


Setter注入

使用示例:在这里插入图片描述
在这里插入图片描述
setter注入的工作原理就是通过你方法参数的类型,去IoC容器中找寻匹配的类型然后注入到参数中!
工作原理与属性注入相同,所以BUG也相同,解决方案也相同。

BUG
假如IoC容器中有两个相同变量的类型,此时就会有BUG。
修改Students代码,让他向IoC容器中添加两个相同类型的对象。
在这里插入图片描述


解决方案1️⃣:使参数列表的变量名与@Bean的名字相同。
解决方案2️⃣:@Autowired配合@Qualifier一起使用在这里插入图片描述

setter注入的优缺点:
优点
通常Setter只Set一个属性,所以Setter注入更符合单一设计的原则。


缺点
1️⃣:无法注入final修饰的变量。
2️⃣:setter注入的对象可以被改变,因为setter是一个方法,可能会被调用多次,因此注入的对象就被改变了。


构造方法注入

使用示例:在这里插入图片描述
在这里插入图片描述
构造方法注入的工作原理就是通过构造方法方法参数的类型,去IoC容器中找寻匹配的类型然后注入到参数中!
工作原理与属性注入相同,所以BUG也相同,解决方案也一半相同。

BUG
假如IoC容器中有两个相同变量的类型,此时就会有BUG。
修改Students代码,让他向IoC容器中添加两个相同类型的对象。
在这里插入图片描述


解决方案:使参数列表的变量名与@Bean的名字相同。
在这里插入图片描述

构造方法注入的优缺点:
优点
1️⃣可以注入final修饰的变量在这里插入图片描述
2️⃣:注入的对象不会被修改,因为构造方法只加载一次。
3️⃣:构造方法注入可以保证注入对象完全初始化。
4️⃣:构造方法注入通用性更好。



缺点
1️⃣:写法比属性注入复杂。
2️⃣:使用构造方法注入,无法解决循环依赖的问题。


@Resource

@Resource与@Autowired的使用方式方法一模一样,但是这两个注解也是有区别的。

@Resource与@Autowired的区别
1️⃣ 出身不同 :@Resource来自于JDK,@Autowired来自于Spring框架。
2️⃣ 支持参数不同 :@Resource支持很多参数设置,@Autowired只支持一个参数设置。(下篇文章介绍)
3️⃣ 使用上的区别 :@Resource不支持构造方法注入,@Autowired支持构造方法注入。
4️⃣ IDEA兼容性不同 :@Autowired在专业版IDEA中可能会误报,@Resource不会。


总结

以上就是今天要讲的内容,本文介绍了使用注解更快捷便利的存储获取Bean对象!

路漫漫不止修身,也养性。

通过Java反射机制获取JavaBean对象
11-04
1.通过Java反射机制获取JavaBean对象。 2.通过JavaBean全路径字符串获取JavaBean对象。 3.获取JavaBean注解信息
普通Java获取SpringBean的方法
sun13770528721的专栏
09-01 333
<br />在SSH集成的前提下。某些情况我们需要在Action以外的类中来获得Spring所管理的Service对象。<br />  之前我在网上找了好几好久都没有找到合适的方法。例如:<br /><br />ApplicationContext context = new ClassPathXmlApplicationContext();<br />  当时我觉得没有这个必要,浪费内存。后来我终于想出了一个解决方法。在此拿来给大家参考下,希望对大家有帮助。<br />  1.创建一个类并让其实现org.
简单存 Bean 对象 -- 五大类注解以及 Bean 方法注解
这个人很懒, 什么都没留下(这是我写的)
04-24 1734
@Controller、@Service、@configuration、@Repository、@Component五大类注解以及@Bean方法注解, 快的存储 Bean 对象
java开发常用注解详解
编程是一门实践技术
03-30 1292
java开发常用注解详解,只需这些就够了
Springbean对象
qq_66924116的博客
08-08 2638
目录一、了解Bean二、Bean的生命周期三、Bean的应用单例模式多例模式单例模式与多例模式优劣势: 什么是javaBean对象?----- Spring Bean的生命周期: 1)通过XML、Java annotation(注解)以及Java Configuration(配置类) 等方式加载Spring Bean2)BeanDefinitionReader:解析Bean的定义。在Spring容器启动过程中, 会将Bean解析成Spring内部的BeanDefinition结构; 理解为:将spring
Spring--Bean对象详解
苏纳法
07-04 2599
本文主要讲述Spring容器中的bean,主要以XML显式配置介绍bean的创建方式、作用范围、以及bean的生命周期。
获取Bean的两种方式(注解、API)
小何的博客
06-14 2166
获取Bean的两种方式(注解、API)
java——spring
04-29
开发者可以通过实现特定接口或使用注解来控制bean的生命周期行为。 4. **AOP(面向切面编程)**: Spring的AOP模块允许开发者定义"切面",这些切面可以封装横切关注点,如日志、事务管理等。通过代理机制,切面...
javaJava框架中常用的注解及其作用详解_资料.docx
12-23
理解Java注解的关键在于熟悉其语法和使用场景,通过注解,开发者可以有效地进行代码管理,提高代码的可维护性和灵活性。在实际项目中,结合Java注解和框架如Spring,可以实现松耦合和高度模块化的架构设计。
java面试——SpringBoot面试专题.zip
09-26
Java开发领域,Spring Boot已经成为了企业级应用开发的主流框架。它简化了Spring应用程序的初始设置和配置,使得开发者可以快地投入到实际的业务逻辑开发中。在面试环节,对于Spring Boot的理解和掌握程度往往是...
Java EE 框架整合开发⼊⻔到实战——Spring+Spring MVC+MyBatis(微课版)课后习题答案.pdf
06-18
这份文档名为《Java EE 框架整合开发入门到实战——Spring+Spring MVC+MyBatis(微课版)课后习题答案.pdf》,它显然是关于Java EE中流行的三个框架整合使用的教程。这三个框架分别是SpringSpring MVC和MyBatis,...
MyBatis与Spring整合——通过官方文档进行最简单的整合
12-18
MyBatis可以使用简单的XML或注解来进行配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。 #### 三、Spring框架简介 Spring框架是用于构建企业级Java应用程序的...
Javabean对象
Yyyuu7的博客
11-03 1307
1.Bean对象 spring的核心功能:创建并维护java对象(称为bean对象),也是Spring容器管理的基本数据。 一个容器可以管理一个或者多个Bean对象Spring管理的bean对象都是通过Configuration metadata配置 的对象。例如:基于xml文件配置的每一个标签,spring容器会维护一个bean对象与之对应) Note:spring容器支持xml配置,java_config和基于注解的配置。 命名bean : 配置bean时 : id和name都是用来给bean给标识符
Bean对象的运行和原理详解
qq_45153375的博客
04-21 658
总的来说,实例化一个 Bean 的过程是比较复杂的,需要从配置、依赖注入、初始化等多个方面进行考虑和处理。但是 Spring IoC 容器可以根据 BeanDefinition 对象来自动完成这些过程,让开发者只需要关注 Bean 的定义和功能实现即可。
Spring】使用注解的方式获取Bean对象对象装配)
m0_73067372的博客
08-06 1619
一、了解对象装配 1、属性注入 1.1、属性注入的优缺点分析 2、setter注入 2.1、setter注入的优缺点分析 3、构造方法注入 3.1、构造方法注入的优缺点 二、@Resource注解 三、综合练习
简单的取 Bean 对象(对象装配)
这个人很懒, 什么都没留下(这是我写的)
05-03 2224
Spring 中属性注入, Setter 注入, 构造方法注入以及 JDK 的 @Resource 注入, 简单的获取 Bean 对象
了解bean对象
weixin_56697114的博客
05-05 1839
1、bean对象的三种创建方式 1)通过调用构造函数创建: 在默认情况下,准备好配置文件后,spring就会调用默认构造函数创建对象,如果不存在默认构造函数,则创建失败
springboot项目打包后在终端运行显示没有主清单属性
最新发布
weixin_52236586的博客
10-20 111
注释pom文件中的这个。
springsecurity使用
ghx123456ghx的博客
10-17 308
首先进入免登录的首页,当点击链接进入受到保护页面时,此时因没有登录,页面自动跳到登录页面,在登录页面输入有USER角色的账号时,自动跳到请求的href="/user/index"后台。2 springsecurity配置。3 登录跳转被保护页面流程。
写文章

热门文章

  • 关于字符串结束标志‘\0‘的一些见解 23933
  • 汉诺塔的详细大白话讲解,助你攻下这座山头 7246
  • 七大排序算法——希尔排序,通俗易懂的思路讲解与图解(完整Java代码) 7071
  • 七大排序算法——堆排序,通俗易懂的思路讲解与图解(完整Java代码) 5403
  • Java 多线程6——计时器Timer的使用 + 详细代码模拟实现 + 代码优化 4985

分类专栏

  • Java数据结构 10篇
  • Java算法 9篇
  • JavaEE 26篇
  • JavaSE 8篇
  • 项目实战 7篇
  • MySQL 2篇
  • C语言 3篇

最新评论

  • 关于字符串结束标志‘\0‘的一些见解

    阳光开朗积极进取: 可以用sizeof和strlen这两个函数试一下

  • 关于字符串结束标志‘\0‘的一些见解

    2302_78284515: 如果字符数组长度为10,存入的字符串仅仅占3个长度,那么后面空的字符数组是全存\0,还是只在字符串最后一个字符后接一个\0啊。表情包

  • 关于字符串结束标志‘\0‘的一些见解

    霰樱。: 随便定的数组长度,不是真是99

  • 关于字符串结束标志‘\0‘的一些见解

    阳光开朗积极进取: 没看明白表情包

  • 二叉树原理 /性质 + 前 /中 /后序 + 层序遍历 + 获取结点个数,叶子结点个数等等方法(java)

    阳光开朗积极进取: 方法名搞错了,图省事直接CV的

最新文章

  • 【Java】Spring拦截器 —— Spring拦截器是什么? 代码实现了Spring拦截器
  • 【Java】SpringAOP —— AOP是什么? 代码实现了SpringAOP
  • 从 0 到 1 ,手把手教你编写《消息队列》项目(Java实现) —— 编写客户端
2024年2篇
2023年53篇
2022年10篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值

玻璃钢生产厂家宣武区商场玻璃钢花盆镇江蓝色玻璃钢花盆三亚玻璃钢雕塑定制河南常见商场美陈销售公司松江玻璃钢雕塑陈设桂林商场美陈贺兰玻璃钢雕塑销售湖北玻璃钢雕塑材质河北商场美陈批发商场亮化美陈目的玻璃钢丙烯仿石雕塑惠州玻璃钢卡通鼠雕塑昭通公园玻璃钢雕塑玻璃钢雕塑喷什么漆玻璃钢雕塑怎么上铜色禹州商场美陈植物墙菏泽玻璃钢雕塑制作不锈钢牛玻璃钢卡通雕塑定做广东商场主题创意商业美陈品牌玻璃钢雕塑大概能用多久广东开业商场美陈报价无锡商场活动美陈舟山玻璃钢雕塑多少钱马鞍山玻璃钢人物雕塑制作临沧玻璃钢烤漆雕塑厂家房山节日商场美陈潮州玻璃钢人物雕塑批量定制玻璃钢雕塑的工序宣城玻璃钢雕塑设计水景校园玻璃钢雕塑制作厂家香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化