【Spring(八)】带你打通Spring的注解开发

news2024/11/14 18:14:26

文章目录

  • 注解开发
    • 注解开发定义bean
    • 纯注解开发
    • 注解开发bean作用范围与生命周期管理
    • 注解开发依赖注入
    • 注解开发管理第三方bean
    • 注解开发实现为第三方bean注入资源
  • 总结

注解开发

  Spring的配置我们已经告一段落了,那接下来我们就要发挥Spring的强项了:简化开发;那么如何做呢,使用注解就能加快开发速度,我们就要来学习Spring的注解开发🎈🎈。

注解开发定义bean

  首先我们先来看看代码环境👇👇

  • dao层实现类
    在这里插入图片描述

  • service注入dao
    在这里插入图片描述

  • 配置文件中仅配置了一个dao

在这里插入图片描述

  • 主程序中我们获取到dao的bean以后直接打印它
    在这里插入图片描述

  • 运行结果
    在这里插入图片描述

  接下来我们来看看如何使用注解的形式来开发Spring程序,在配置中现在仅仅配了一个dao的bean,那我们就先做第一件事,把它改成注解开发的,不把它写到配置文件中,那我们就需要写到类中去,由于是对dao层的实现类配置的bean,那我们就需要写到这个类中去,怎么写呢,需要在这个类中加一个注解@Component,什么意思呢,叫做组件,把它写上以后就代表了我们配置文件中的<bean/>,现在我们就配置了一个bean👇👇

在这里插入图片描述

  但是没有给它起名称,如果想要给它起名称应该怎么做,就要在它后边加括号写上它的名称就可以了,比如我们要给它起名为bookdao👇👇。

在这里插入图片描述

  我们可以点开Component的源码,它在里边提供了一个value属性,由于value可以不写,所以我们在这里直接使用上边的格式就可以了🎉🎉。

在这里插入图片描述

  我们把这弄完以后,新的问题就有了,按照这个形式,我们的bean已经配完了,那我们配置文件中配bean的那句话就可以删除了,但是Spring的配置文件怎么知道我们的实现类中写了@Component("bookdao")呢,换句话说,你随便找一个类,写一个这个东西就行吗?看来我们得让Spring容器感知到你这里写了这么一个东西,怎么办呢,我们就要去搜索它、找它,因此在Spring的配置文件中提供了这么一个标签,注意这个标签是属于context命名空间的,怎么写:context:component-scan base-package="com.itheima.dao.impl"/> ,这样就指定到了这个类所在的位置就可以扫到这句话了👇👇。

在这里插入图片描述

  我们也可以用这种方式对service进行注解👇👇。

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

  当然这里也可以不在注解里边写对应的bean的名称,然后在主程序中通过类型来获取bean🎉🎉。

  在这里我们要说一下,Spring给我们提供了@Component的三个衍生注解,什么意思呢,它说你都写@Componment可能分的不是多么清楚,这样,我给你三个衍生注解你能分的更清晰一些👇👇。

在这里插入图片描述
注意:三个衍生类和@Component的作用一模一样,只是为了更好的去区分

纯注解开发

  前边我们说了Spring3.0升级了纯注解开发模式,也就是说一点配置文件都不写了,那接下来咱们就来说一下纯注解开发该怎么做🎈🎈。
  回到我们程序中,我们来想一件事,如果我们在配置文件中写的context:component这句话没有的话,那我们的配置文件不就只剩下一个壳了吗,那我们就完全可以删掉配置文件了,但是问题是现在还有这么一句话,看来我们得换一种形式来表现它,那怎么换呢,对于Java程序来说,我们主要写的是类,那如果说现在我们不写配置文件了,那还能写什么呢,用类来替换它,我们来学习一下该怎么去做 💪💪。

  我们新建一个类叫做:config.SpringConfig,我们用这个类来代替我们之前的配置文件👇👇。

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

  我们只需要在这个类的上边加一个@Configuration,这句话写上以后就代表这是一个配置类了,这句话就代表了配置文件中的这些东西👇👇。

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

  但是我们的context:component这句话还没有搬过去,那我们现在要把它搬过去,应该怎么做,我们要在我们的配置类里边再加一个注解扫描我们的Component,这样写:@ComponentScan("com.itheima"),括号里边的内容是要指定的包👇👇。

在这里插入图片描述

  到这我们的配置类就已经完全替换完了,现在这个配置文件其实就可以直接删掉了,那么现在问题就来了,我们的应用程序就不行了👇👇。

在这里插入图片描述

  我们在获取容器的时候是需要加载配置文件的,所以现在就不能这么写了,我们来重新写一下应用程序👇👇。

在这里插入图片描述

  在上边我们仍然需要加载我们的配置,注意不是配置文件,是配置类,上边框出来的就是加载配置类的代码,剩下来的事和前边写的完全一样🎉🎉。

  • 注意:
    在这里插入图片描述
    在这里插入图片描述

注解开发bean作用范围与生命周期管理

  以下是程序的初始环境👇👇。

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

  现在运行出来应该出来的是单例对象,那怎么设置它为非单例对象呢,只需要在BookDaoImpl类中写上@Scope("prototype"):非单例,或@Scope("singleton"):单例👇👇。

在这里插入图片描述

  如果想要控制它的生命周期该怎么做呢,我们先来两个方法,把我们生命周期的方法做出来,@PostConstruct是配置初始化方法,PostConstruct的中文意思就是在构造方法之后,我们前边学过init()方法就是在构造方法之后执行的,@PreDestory是配置销毁方法的,PreDestory中文意思是在销毁之前的意思,也就是彻底销毁之前👇👇。

在这里插入图片描述

  我们在主程序中使用关闭容器的方式来做👇👇。

在这里插入图片描述

在这里插入图片描述

注解开发依赖注入

  在这块我们只学习一个东西:自动装配,我们先来熟悉一下程序环境👇👇。

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

  当我们运行的时候会发现service的运行ok,但是第二句执行我们的dao的操作因为没有注入成功所以说它是个空对象👇👇。

在这里插入图片描述

  我们来解决这个问题,怎么样给它注入对象呢,在service的实现类中写上@Autowired,就可以了,那它是按照什么装配的呢,我们可以看一下我们的dao有名吗,没有,它是按类型转配的,这个注解哪个位置都可以放, 所以我们拿掉set方法也是可以的,这是使用反射里边的暴力反射给BookDao的对象直接加值了,

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

  那我们如果有两个数据层的实现呢,该怎么办,或者说应该装配哪一个,要想解决这个问题,我们就要用到按名称装配,接下来我们起名👇👇。

在这里插入图片描述

在这里插入图片描述

  现在我们仅仅是起了两个名称,Sping可以支持按名称注入,如果在注入的过程中有多个相同的bean,使用@Qualifier来指定名称,想要注谁就把谁的名称写上👇👇。

在这里插入图片描述

  注意:@Autowired必须保留❗❗

  现在我们再来看看简单类型如何去做,我们在dao的实现类中加一个属性name,简单类型这么写:@Value(),括号里边写入它的值👇👇。

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

  我们现在的这个值是写死的,为了不让写死,我们来学习一下如何让它加载外部的property文件👇👇。

在这里插入图片描述

  在配置中我们如果想要加载它,必须还要用到一个性:@PropertySource(),里边写文件名👇👇。

在这里插入图片描述

  写完它以后,我们应该在dao层的实现类中如何用呢,接下来我们看看👇👇。

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

  注意:如果配置文件过多的话,需要用到数组👇👇,这个里边不支持通配符。

在这里插入图片描述

注解开发管理第三方bean

  前边我们做的注解开发都是管理自己的bean,那还有一堆你管不着的呢,那些第三方的我们如何在人家的jar包里边写@Component这些,我们接下来学习第三方bean如何管理✍️✍️。

  我们先来熟悉一下程序环境👇👇。

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

  管理第三方bean,由于不能直接把配置写在人家的源代码中,所以在这里边我们就必须去写它,怎么写👇👇

  • 导入依赖坐标

在这里插入图片描述

  • 在SpringConfig中定义一个方法获得要管理的对象
    在这里插入图片描述

  • 把方法的返回值定义成一个bean
    在这里插入图片描述

  • 主程序
    在这里插入图片描述

  这就是我们管理第三方bean的方式,如果想要管理多个,继续在SpringConfig中写方法就行了💪💪。

  现在还存在一个问题,我们刚才是在Spring的配置文件中写的,我们的这个bean是与jdbc有关的,如果都写在我们Spring的配置文件中,都写在这里面是不是就挤爆了,怎么办,拆出去,写一个独立的配置文件👇👇。

  • 第一种方式
    在这里插入图片描述
    在这里插入图片描述

注意:这种方式不推荐使用❗❗

  • 第二种方式
    在这里插入图片描述

  然后注掉JdbcConfig配置类中的@Configuration就行了🎉🎉。

注解开发实现为第三方bean注入资源

  如果我们上边配置类中配置的bean还需要其他的东西应该怎么办,接下来我们先来看第一种,简单类型缺了怎么办,比如说DriverClassName的值不应该是来自我们的配置文件吗,我们怎么能直接写在配置类中呢,所以我们在上面的基础上还需要改一下,对于简单类型,它的写法比较粗暴👇👇

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

  接下来我们看看引用类型如何注入,引用类型的注入方式比较特殊,我们需要在它的方法的参数位置,传递你想要的东西,我们假设它运行需要dao, 首先我们先的把扫描给它打开👇👇。

在这里插入图片描述

  现在的效果是,容器一启动,我们的dao层的bean就加载了,容器中有这个bean了,这是第一,第二我们在配置类中配置的第三方bean需要dao层的bean,那我们就要给它写上👇👇,并且我们在里边打印bookdao。

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

  我们从运行结果中的确发现,这个bookdao打印出来了,其实我只是在方法里传了一个参数,为什么就能打印出来呢,这是因为自动装配,因为它检测到了你这个方法是在做第三方bean,或者是说你要配一个bean,它就认为你的形参它要给你提供,于是它就在容器中找这个类型的bean,找了有,如果我们将这个bean注掉的话,那结果是肯定找不到的👇👇。

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

注意:引用类型注入只需要为bean定义方法设置形参即可,容器会根据类型自动装配对象

总结

  以上就是我们Spring注解开发的全部内容,最后,如果有什么错误的话,大家可以私信我📬📬,希望大家多多关注+点赞+收藏 ^_ ^🙏🙏,你们的鼓励是我不断前进的动力💪💪!!!

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

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

相关文章

MySQL —— 数据库基础

目录 一、数据库的基本概念 1. 什么是数据库 2. 主流的数据库 二、基本使用 1. 连接服务器 2. 服务器管理 3. 服务器、数据库、表关系 4. 使用案例 5. 数据库的存储逻辑 三、MySQL架构 四、SQL分类 五、存储引擎 1. 存储引擎 2. 查看存储引擎 3. 存储引擎对比 …

Elasticsearch 这篇还不够吗

系列文章目录 文章目录系列文章目录一、概述1. ES 的基本概念2. ES 和关系型数据库的对比二、环境准备1. linux 下单机安装三、入门操作1. 创建索引2. 写入文档3. 根据id搜索文档4. 根据一般字段搜索文档5. 根据文本字段搜索文档四、ES 客户端实战1. Spring Data Elasticsearch…

学习shell与shell编程 vi与vim

Linux配置文件都是以ASCII的纯文本形式存在。 为什么学习vi 1)UnixLike系统都会内置vi文本编辑器&#xff0c;其他的文本编辑器则不一定存在 2)许多软件的编辑接口都会主动调用vi 3)vi具有程序编辑的能力&#xff0c;可以主动以字体颜色辨别语法的正确性 4)程序简单&#…

webgl纹理贴图机制

文章目录前言纹理图片大小规范纹理坐标系统贴图流程JavaScript部分齐次坐标—uv坐标数据准备加载外部纹理图像纹理配置加载着色器部分顶点着色器片元着色器完整示例使用多张纹理着色器接受两个纹理单元封装纹理配置赋值函数完整示例总结前言 在计算机图形学中&#xff0c;为了…

HTML+CSS+JS制作炫酷【烟花特效】

文章目录制作炫酷烟花特效一、普通烟花(分散形)HTML代码CSS代码JS代码二、圆形烟花HTML代码CSS代码JS代码三、爱心形烟花HTML代码CSS代码JS代码四、源码获取在线下载制作炫酷烟花特效 &#x1f4a1;本篇内容使用htmlcssjs制作鼠标点击出现烟花效果&#xff0c;分别介绍了分散型…

python-测试代码

1. 测试函数get_name.pydef combination(first, last):将姓名组合在一起name first lastreturn name.title()hello_world.pyfrom get_name import combinationprint("Enter q to quit!") while True:first input(Please input your first name: )if first q:b…

理光Aficio MP C2500扫描到文件夹设置方法

首先在需要接收扫描文件的电脑上设置共享文件夹。 注&#xff1a; &#xff08;1&#xff09;文件夹的名字最好简单一点&#xff0c;比如&#xff1a;scan、123等等&#xff1b; &#xff08;2&#xff09;文件夹的共享权限最好能设置为最大&#xff08;WindowsXP、Windows200…

Future、CompletableFuture概述

1.同步和异步 &#xff08;1&#xff09;同步&#xff1a;需要等待结果返回&#xff0c;才能继续运行 &#xff08;2&#xff09;异步&#xff1a;不需要等待结果返回&#xff0c;就能继续运行 &#xff08;3&#xff09;异步设计&#xff1a;多线程可以让方法执行变为异步(比…

第四章必备前端基础知识-第二节3:CSS盒模型和浮动

文章目录一&#xff1a;盒模型&#xff08;1&#xff09;border&#xff08;2&#xff09;padding&#xff08;3&#xff09;margin二&#xff1a;flex布局一&#xff1a;盒模型 盒模型&#xff1a;在HTML中&#xff0c;每个标签&#xff08;或元素&#xff09;相当于是一个盒…

Mybatis和Jpa

这里写目录标题1.Mybatis1.1 JDBC的缺点1.2 Mybatis的整体架构1.3 入门案例1.3.1 问题:无法连接到数据库服务器1.4 动态代理实现Mapper1.5 mybatis-config.xml配置1.5.1 properties属性读取外部资源1.5.2 settings设置1.5.3 typeAliases1.5.4 typeHandlers&#xff08;类型处理…

【Substance Designer】基础操作和节点学习记录

写在前面 这个记录稍微有点杂&#xff0c;大概是庄懂的技术美术入门课(美术向)-直播录屏-第20课和一些基础操作的记录合集吧&#xff01; 补充 学习发现&#xff0c;基础的节点是需要学习和记录的&#xff0c;但是真正用起来还是要多用多练&#xff01;所以这种简单的记录节点…

YOLOv5/v7 引入 RepVGG 重参数化模块

本篇博文代码出自YOLOv5-lite &#xff0c;YOLOv5-lite的作者在CSDN的账号是 pogg_ &#xff0c;大家可以关注一下&#xff0c;这也是一位在开源项目上做了很多工作的博主。 RepVGG的原理和融合推导过程可以看我的这篇博文&#xff1a;RepVGG&#xff1a;让VGG风格的ConvNets再…

机制设计原理与应用(三)Screening

文章目录3 Screening3.1 为单个不可分割的项目定价3.1.1 对θ\thetaθ的假设3.1.2 问题描述3.1.3 特性3.2 为无限可分的项目定价3.2.1 对θ\thetaθ的假设3.2.3 特性3.2.4 收益最大化3.2.5 最优解决方案3 Screening Screening theory&#xff1a;机制设计理论可以被看作是其多…

Cadence PCB仿真使用Allegro PCB SI生成振铃ringing仿真报告及报告导读图文教程

🏡《Cadence 开发合集目录》   🏡《Cadence PCB 仿真宝典目录》 目录 1,概述2,生成报告3,报告导读4,总结1,概述 本文简单介绍使用Allegro PCB SI生成网络的振铃性能评估的报告的方法,及振铃ringing报告要点导读。 2,生成报告 第1步,选择需要生成报告的网络,然后…

第二章 ArcGIS数据和地理数据库

文章目录第一节 ArcGIS和4D数据基本知识1 4D数据介绍1.1 DLG1.2 DEM1.3 DOM1.4 DRG1.5 4D表现2 ArcGIS的数据和4D数据对应3 栅格数据3.1 查看帮助3.2 空间分辨率3.3 分辨率与比例尺换算3.4 栅格数据介绍——cellsize3.5 栅格数据波段3.6 栅格格式4 栅格数据改变分辨率5 转换栅格…

【 uniapp - 黑马优购 | 登录与支付(2)】如何实现三秒后跳转和微信支付

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大二在校生&#xff0c;讨厌编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;小新爱学习. &#x1f43c;个人WeChat&#xff1a;见文末 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;…

Ubuntu20.04+MAVROS+PX4+Gazebo安装教程

Ubuntu20.04MAVROSPX4Gazebo安装PX4步骤安装MAVROS安装QGCPX4仿真安装PX4步骤 从github上clone源码 git clone https://github.com/PX4/PX4-Autopilot.git --recursive进入PX4-Autopilot文件夹&#xff0c;继续下载未下载完的组件 cd PX4-Autopilot/ git submodule update -…

flowable使用 act_hi_xxx

HistoryService 流程历史信息 act_hi_procinst : 历史流程信息&#xff0c;&#xff0c;如果流程执行完了&#xff0c;end_time_ 和 duration不为null // 没有执行完的List<HistoricProcessInstance> list historyService.createHistoricProcessInstanceQuery().unfi…

uniapp封装并全局挂载request请求

前言 日常开发中,前端项目中需要调用服务端api完成页面渲染,uniapp提供的请求api:uni.request相对繁琐;另外服务端提供的不同api仅子路径不同,api域名以及根路径都是相同的,一旦接口api变更,需要更改地方就会很多.鉴于以上可以将uni.request进行封装,简化开发. 目前uniapp项…

MySQL(四):B+树索引、聚簇索引、二级索引、联合索引

目录一、B树索引1.1 在没有索引时进行查找记录1.2 索引方案1.3 InnoDB中的索引方案二、聚簇索引三、二级索引四、联合索引五、InnoDB中B树索引的注意事项5.1 根页面的位置不会改变5.2 内节点中目录项记录的唯一性5.3 一个页面至少容纳两条记录一、B树索引 数据库中的用来存储数…