【JavaEE进阶篇2】spring基于注解开发1
在上一篇文章当中,我们提到了怎样使用spring来创建一个bean对象。下面,我们继续来研究一下,更加优胜的开发方式:基于注解开发【JavaEE进阶篇1】认识Spring、认识IoC、使用spring创建对象_革凡成圣211的博客-CSDN博客springIoc、使用spring创建对象https://blog.csdn.net/weixin_56738054/article/details/129540402?spm=1001.2014.3001.5502
目录
第一步:在pom.xml当中导入依赖、并且在xml文件当中添加如下内容
为什么要使用 并且指定base-package的目录?
第二步:把bean存放到IoC容器当中
类注解(作用于类上面)
@Controller:把一个类标记为"控制器"
spring给类命名的规则
@Service
@Repository
@Component
@Configuration
为什么作用都一样,但是还是要这么多注解
5大类注解之间的关系
方法注解(作用在方法上面的注解)
第一步:新建一个User类
第二步:在另外一个类当中自定义一个返回User的方法
第三步:通过getBean方法获取User对象
第一步:在pom.xml当中导入依赖、并且在xml文件当中添加如下内容
在maven项目当中导入(pom.xml)依赖:
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.15.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>5.2.15.RELEASE</version></dependency></dependencies>
在spring配置文件当中,复制以下的内容即可。
所有要存放到spring中bean的根路径,在此处就指定为"Beans"目录及其子目录下面的所有文件。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd"><!-- 声明扫描包以及子包的类。如果发现有组件注解的类,就创建对象,并加入到容器 --><!--此时,指定的扫描包的名称为Beans,在这个包下面需要存扫描的文件--><context:component-scan base-package="Beans"/></beans>
为什么要使用<context:component-scan> 并且指定base-package的目录?
在spring当中的类分为两大类,一大类是在spring当中的,另外一大类是不在spring当中的。
如果使用了这个注解,那么也就意味着:Beans目录下面的类如果被注解作用了,那么就会被放入spring容器当中。
这样设计,可以有效帮助spring减少扫描的次数,只扫描指定目录的类,提升查找的效率。
第二步:把bean存放到IoC容器当中
一般情况下面,把bean放入到IoC容器当中,需要使用到下面的5大类注解:
类注解作用于类上面之后,都会为这个类在spring容器当中注入一个对象。
类注解(作用于类上面)
@Controller:把一个类标记为"控制器"
控制器的含义就是:三层架构当中的Controller对应的类。
其中,@Controller注解当中传入的参数,就是这一个类对象的名称。
@Controller("User")
public class User {public void say(){System.out.println("user say...");}
}
如果想要获取这个bean,可以这样获取:
public static void main(String[] args) {ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring-config.xml");//在容器当中指定对象的名称,指定User.class的内容User user=applicationContext.getBean("User",User.class);user.say();}
这两个内容要一致。
如果@Controller当中没有指定名称。那么,getBean的时候,传入的id就应当默认为User类名称的小驼峰:user。
但是,如果一个类的名称,没有按照驼峰命名法的规则来呢?
获取APIContext类的对象:
public static void main(String[] args) {ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring-config.xml");//在容器当中指定对象的名称,此处假设一个类不按照小驼峰的方式开命名APIContext aPIContext=applicationContext.getBean("aPIContext", APIContext.class);aPIContext.say();}
运行就会发现:
下面,来看一下spring给bean命名的潜规则:
spring给类命名的规则
来看一下源码:
然后,在这个类的内部,往下拉动,找到这两个方法buildDefaultBeanName方法:
最后,跳转到这个方法:decapitalize。下面,重点来分析一下这个方法:
因此,总结一下spring在没有指定类的名称的时候,是怎样转化的:
当类名称的首字母和第二个字母都是大写的时候:那么对象名称(bean的名称)就是类名。
如果类名称的其余情况:对象名称=类名称的第一个字母转为小写+后面内容一致。
下面,来试验一下这个命名规则:(调用Introspector.decapitalize(String name)这个方法)
public static void main(String[] args) {String name="UserName";System.out.println(Introspector.decapitalize(name));}
运行的结果是:
再实验一下API这样的形式:
public static void main(String[] args) {String name="APIContext";System.out.println(Introspector.decapitalize(name));}
然后观察一下运行的结果:可以看到,此时bean的名称就是类名称了。
@Service
作用与Controller一样,用于标注"业务逻辑层"的对象。
@Repository
作用与Controller一样,用于标注"持久层"的对象
@Component
不属于前面的任意3层,那么这个注解就可以认为是一个"工具"。
@Configuration
作用与Controller一样,用于标注"配置类"。
为什么作用都一样,但是还是要这么多注解
这就涉及到"软件开发"的模型了。为了实现一个软件功能的解耦合,软件开发一般要至少分为4个层次:
层次1:前端的页面展示;
层次2:接口层,用于接收并且校验前端提交的参数,,调用逻辑层,并且作出响应(一般这个层的类需要使用@Controller来标注);
层次3:逻辑层,用于处理接口层传来的数据,并且处理业务逻辑。如果一些业务需要和数据库层打交道,那么逻辑层就会调用下一层。(使用@Service注解作用)
层次4:持久层,用于和数据库打交道的层面。(使用@Repository来作用)
分开了5大类注解,令代码的可读性提高了,让程序员能够直观地判断当前类的业务用途。
5大类注解之间的关系
当我们点开各个注解的时候,可以看到:除了@Component注解以外的注解,都是基于@Component来实现的。也就是说,@Component是上述所有注解的父类。
方法注解(作用在方法上面的注解)
这个注解的作用,也是把bean给注入到spring容器当中,但是这个bean是作为方法的返回值。
第一步:新建一个User类
public class User {private int id;private String name;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +'}';}
}
第二步:在另外一个类当中自定义一个返回User的方法
第二步由两个比较重要的部分构成:
第一部分:需要在这个方法上面加一个注解:@Bean。
第二部分:并且还需要在这个方法所在的类上面再加一个五大类注解当中的一个。
为什么spring规定不可以单独把@Bean注解作用于方法上,然后把这个方法的返回值放入到spring容器当中
提高效率!
在类上面增加了注解之后,可以有效降低spring组件扫描的范围。当且仅当一个类被5大注解作用的时候,才会扫描这个类当中@Bean方法返回值注入的对象。
/*** @author 25043*/
//这个注解不可以少
@Service
public class UserBeans {//把方法返回的值作为对象存储到Ioc容器当中@Beanpublic User user1(){//创建一个User对象User user=new User();//设置属性的值user.setId(1);user.setName("你好");//返回user对象return user;}
}
此外,还可以在@Bean注解当中指定需要存放对象的名称(通过name属性指定注入的bean的名称):
//在注解当中指定name属性,就是返回值在spring容器当中的bean@Bean(name = {"user2","userInfo"})public static User getUser2(){User user=new User();user.setId(2);user.setName("你好2");return user;}
这个时候,通过两个不同的key,也可以找到同一个user了。因为此时在ioC容器当中,有两个相同的key指向了同一个user。
第三步:通过getBean方法获取User对象
getBean方法当中,传入的两个参数分别是:
@Bean注解作用的方法的名称
User类的class对象
public static void main(String[] args) {//获取spring上下文对象ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring-config.xml");//传入两个参数,一个是方法名称:user1,另外一个是User的class对象User user=applicationContext.getBean("user1",User.class);System.out.println(user);}
运行的结果:
第三步注意事项:
如果getBean()方法当中只传入一个参数:User.class的话,那么此时默认IoC容器当中只有一个User类型的bean。如果有两个User类型的bean的话,那么就会报错。
下面演示一下出错的情况:
①放入两个不同的bean,但是都是User类型
@Service
public class UserBeans {@Beanpublic User user1(){User user=new User();user.setId(1);user.setName("你好");return user;}//在注解当中指定name属性,就是返回值在spring容器当中的bean@Bean(name = {"user2","userInfo"})public static User getUser2(){User user=new User();user.setId(2);user.setName("你好2");return user;}
}
②调用传入
相关文章:
【JavaEE进阶篇2】spring基于注解开发1
在上一篇文章当中,我们提到了怎样使用spring来创建一个bean对象。下面,我们继续来研究一下,更加优胜的开发方式:基于注解开发【JavaEE进阶篇1】认识Spring、认识IoC、使用spring创建对象_革凡成圣211的博客-CSDN博客springIoc、使…...
统一登录验证统一返回格式统一异常处理的实现
统一登录验证&统一返回格式&统一异常处理的实现 一、用户登录权限效验1.1 最初的用户登录验证1.2 Spring AOP 用户统一登录验证的问题1.3 Spring 拦截器1.3.1 准备工作1.3.2 自定义拦截器1.3.3 将自定义拦截器加入到系统配置1.4 拦截器实现原理1.4.1 实现原理源码分析1…...
【建议收藏】华为OD面试,什么场景下会使用到kafka,消息消费中需要注意哪些问题,kafka的幂等性,联合索引等问题
文章目录 华为 OD 面试流程一、什么场景下会使用到 kafka二、消息消费中需要注意哪些问题三、怎么处理重复消费四、kafka 的幂等性怎么处理的五、kafka 会怎么处理消费者消费失败的问题六、数据库设计中,你会如何去设计一张表七、联合索引有什么原则华为 OD 面试流程 机试:三…...
【MySQL】MySQL的优化(二)
目录 explain分析执行计划 Explain分析执行计划-Explain 之 id Explain分析执行计划-Explain 之 select_type Explain分析执行计划-Explain 之 type Explain分析执行计划-其他指标字段 explain分析执行计划 通过以上步骤查询到效率低的 SQL 语句后,可以通过 …...
QT VTK开发 (一、下载编译)
Vtk,(visualization toolkit)是一个开源的免费软件系统,主要用于三维计算机图形学、图像处理和可视化。Vtk是在面向对象原理的基础上设计和实现的,它的内核是用C构建的,包含有大约250,000行代码,…...
C/C++每日一练(20230314)
目录 1. 移动数组中的元素 2. 搜索二维矩阵 3. 三角形最小路径和 🌟 每日一练刷题专栏 🌟 Golang 每日一练 专栏 C/C 每日一练 专栏 Python 每日一练 专栏 Java 每日一练 专栏 1. 移动数组中的元素 将一维数组中的元素循环左移 k 个位置 输入…...
裸辞3个月,面试了25家公司,终于找到心仪的工作了
上半年裁员,下半年裸辞,有不少人高呼裸辞后躺平真的好快乐!但也有很多人,裸辞后的生活五味杂陈。 面试25次终于找到心仪工作 因为工作压力大、领导PUA等各种原因,今年2月下旬我从一家互联网小厂裸辞,没…...
【Linux学习】进程间通信——system V(共享内存 | 消息队列 | 信号量)
🐱作者:一只大喵咪1201 🐱专栏:《Linux学习》 🔥格言:你只管努力,剩下的交给时间! 进程间通信——共享内存 | 消息队列 | 信号量🏀共享内存⚽系统调用shmgetkey值⚽系统…...
解决 IDA 防F5转伪C笔记
某app砸壳后放到IDA,根据堆栈查到该位置如下; G调到,0x1b81bcc 看下: BR 调到后面 x8 x9地址,汇编指令; 找到x9的地址,然后减去基地址也就是首地址,得到便宜地址; hook x9: var moduleAddr = Module.findBaseAddress("XX"); var line = moduleAddr.add...
【面试题】你需要知道的webpack高频面试题
大厂面试题分享 面试题库前后端面试题库 (面试必备) 推荐:★★★★★地址:前端面试题库谈谈你对webpack的看法webpack是一个模块打包工具,可以使用它管理项目中的模块依赖,并编译输出模块所需的静态文件。它…...
【YOLOv8/YOLOv7/YOLOv5/YOLOv4/Faster-rcnn系列算法改进NO.60】损失函数改进为wiou
前言作为当前先进的深度学习目标检测算法YOLOv8,已经集合了大量的trick,但是还是有提高和改进的空间,针对具体应用场景下的检测难点,可以不同的改进方法。此后的系列文章,将重点对YOLOv8的如何改进进行详细的介绍&…...
2023年中职网络安全竞赛——数字取证调查(新版)attack解析(详细)
数字取证调查 任务环境说明: 服务器场景:FTPServer20221010(关闭链接)服务器场景操作系统:未知FTP用户名:attack817密码:attack817分析attack.pcapng数据包文件,通过分析数据包attack.pcapng找出恶意用户第一次访问HTTP服务的数据包是第几号,将该号数作为Flag值提交;…...
Cadence Allegro 导出Net Single Pin and No Pin报告详解
⏪《上一篇》 🏡《上级目录》 ⏩《下一篇》 目录 1,概述2,Net Single Pin and No Pin作用3,Net Single Pin and No Pin示例4,Net Single Pin and No Pin导出方法4.1,方法14.2,方法2B站关注“硬小二”浏览更多演示视频...
蓝桥冲刺31天之317
在这个时代,我们总是在比较,觉得自己不够好 其实不必羡慕别人的闪光点 每个人都是属于自己的限量版 做你喜欢并且擅长的事,做到极致 自然会找到自己独一无二的价值 鸟不跟鱼比游泳,鱼不跟鸟比飞翔 你我各有所长 A:组队…...
站上风口,文心一言任重道远
目录正式发布时机选择逻辑推理AI绘画用户选择总结自从OpenAI公司的chatGPT发布以来,吸引了全球目光,同时也引起了我们的羡慕,希望有国产的聊天机器人,盼星星盼月亮,终于等来了百度文心一言的发布。 正式发布 3月16日…...
Qt音视频开发24-视频显示QOpenGLWidget方式(占用GPU)
一、前言 采用painter的方式绘制解码后的图片,方式简单易懂,巨大缺点就是占CPU,一个两个通道还好,基本上CPU很低,但是到了16个64个通道的时候,会发现CPU也是很吃紧(当然强劲的电脑配置另当别论…...
百度发布文心一言,我想说几句
大家好,我是记得诚。 今天下午百度公司正式发布了文心一言,算是国内第一个交卷的互联网公司。 在ChatGPT和GPT-4的双重夹击下,可想而知百度的压力。 ChatGPT发布的时候,热度非常的高,大家对其都非常的感兴趣。 我是…...
简单了解JSP
JSP概念与原理概念: Java Server Pages,Java服务端页面一种动态的网页技术,其中既可以定义 HTML、JS、CSS等静态内容,还可以定义Java代码的动态内容JSP HTML Java, 用于简化开发JSP的本质上就是一个ServletJSP 在被访问时,由JSP容…...
Qt(c++)调用海康威视监控摄像头
文章目录一.海康威视监控摄像头开发SDK介绍二.海康SDK模块说明三.Qt项目中海康威视SDK配置四.实时预览摄像头图像程序一.海康威视监控摄像头开发SDK介绍 设备网络SDK是基于设备私有网络通信协议开发的,为嵌入式网络硬盘录像机、NVR、网络摄像机、网络球机、视频服务…...
深度学习部署笔记(十五): CUDA_Run_Time_API_parallel_多流并行,以及多流之间互相同步等待的操作方式
// CUDA运行时头文件 #include <cuda_runtime.h>#include <chrono> #include <stdio.h> #include <string.h>using namespace std;#define checkRuntime(op) __check_cuda_runtime((op), #op, __FILE__, __LINE__)bool __check_cuda_runtime(cudaErro…...
【Spring】spring框架简介
一、框架 1.框架的基本特点: 框架(Framework),是基于基础技术之上,从众多业务中抽取出的通用解决方案;框架是一个半成品,使用框架规定的语法开发可以提高开发效率,可以用简单的代码就能完成复杂的基础业务;框架内部使用大量的设…...
WuThreat身份安全云-TVD每日漏洞情报-2023-03-17
漏洞名称:TP-LINK Archer AX21 命令注入漏洞 漏洞级别:严重 漏洞编号:CVE-2023-1389,CNNVD-202303-1280 相关涉及:TP-LINK Archer AX21 1.1.4 Build 20230219之前的固件版本 漏洞状态:POC 参考链接:https://tvd.wuthreat.com/#/listDetail?TVD_IDTVD-2023-06347 漏洞名称:D-L…...
postman 调用webservice
有个外部接口需要提供古老的webservice 格式接口。1 设置格式按照xml 格式设置。2 消息体xml 封装不加envelope:<soap:Envelope xmlns:soap"" target"_blank">http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><soap:Fault&…...
基于华为模拟器(ensp)的静态路由配置实验
一 实验需求静态路由实验,建立拓扑pc1>>R1>>R2>>R3>>pc2,使pc1与pc2能相互通信。二 实验拓扑三 ip地址规划设备接口ip地址AR1G0/0/0192.168.10.254/24G0/0/112.1.1.1/24AR2G0/0/012.1.1.2/24G0/0/123.1.1.2/24 AR3G0/0/023.1.1.…...
模拟实现字符串函数(长度受限制的详讲)
上次发布了长度不受限制的字符串函数的模拟实现方法,这次就给大家说说长度受限制的字符串函数。首先,长度受限制和不受限制有什么区别呢?其实从某种意义上来讲,长度受限制的字符串函数比长度不受限制的字符串安全,为什…...
分布式ID生成方案总结
什么是分布式 ID 分布式 ID 是指,在分布式环境下可用于对数据进行标识且易存储的全局唯一的 ID 标识。 为什么需要分布式 ID 对于单体系统来说,主键ID可能会常用主键自动的方式进行设置,这种ID生成方法在单体项目是可行的。 对于分布式系统…...
极智AI | 百度推出文心一言,对标ChatGPT功力几成
欢迎关注我,获取我的更多经验分享,极智传送《极智AI | 百度推出文心一言,对标 ChatGPT 功力几成》 大家好,我是极智视界,本文介绍一下 百度今日推出文心一言,对标ChatGPT功力几成。 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码下载,链接:https…...
CleanMyMac X最新版本4.12.6
系统要求macOS 10.12及更高,M1机型及最新macOS 13 CleanMyMac可以为Mac腾出空间,软件已经更新到CleanMyMac X支持最新版Mac系统。CleanMyMac具有一系列巧妙的新功能,可让您安全,智能地扫描和清理整个系统,删除大量未使…...
替代notepad++,notepad--介绍及插件cmake编译
Notepad 是一个文本编辑器小软件,用来替代windows自带的记事本。然而Notepad软件的作者是台湾省人,其具有明显的gd/jd/td倾向,如果你不赞同他的观点,Notepad将会在你的源码里面插入随机字符。推荐一款国产的开源跨平台软件NDD(not…...
机器学习笔记之集成学习(四)Gradient Boosting
机器学习笔记之集成学习——Gradient Boosting引言回顾:Boosting\text{Boosting}Boosting算法思想与AdaBoost\text{AdaBoost}AdaBoostGradient Boosting\text{Gradient Boosting}Gradient Boosting算法介绍场景构建算法过程迭代过程与梯度下降法之间的关联关系引言 …...
外贸公司的网站建设模板/网站收录查询爱站
1、启动 NODE_ENVproduction node index.js 如果出现启动不了的情况,在该命令加sudo sudo NODE_ENVproduction node index.js 2、备份数据以及切换数据库 备份数据 进入http://your.domain/labs 操作很简单,export 导出 json文件 3、切换数据库 主要修改…...
做网站需要上门服务吗/表白网页制作免费网站制作
0x00 前言 为了练习python,强迫自己能用Python的题都用python解题还有各种密码 0x01 奇怪的字符串 实验吧题目:信息保密的需求和实际操作自古有之,与之相应的信息加密与解密也是历史悠久,现有一段经过古典密码理论(不止…...
网站访客记录/新手如何学seo
wps表格绘制斜线表头的方法和excel的方法有些不同,所以有些人在绘制表头的时候遇到了麻烦,用WPS表格做报表、姓名表、日常表、工资单的时候最麻烦的就是制作各种各样的表头,而WPS表格又没有提供“绘制斜线表头”功能,对初学者来说…...
佛山网站建设明细/seo技术培训广东
蓝牙(CoreBluetooth)-中心设备(客户端) 蓝牙客户端-中心设备 主要内容 1. 创建中央管理器 2. 发现并且连接外设 3. 寻找连接上的外设数据 4. 发送读或写特征值的请求 5. 订阅外设特征值 1. 创建中心管理器 因为CBCentralManager代表着本地中央设备,所以你必须先创建一个中央管理…...
怎样选择高性价比的建站公司/sem搜索
import export 这两个家伙对应的就是es6自己的module功能。 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小工程,再用一种简单的方法把这些小工程连接在一起。 这有可能导致两个问题&…...
建设网站企业邮箱/网站seo外包公司有哪些
本博文记录阅读《C Primer》过程中遇到的未理解知识点,便于日后回头有针对性的攻克。 教材:《C Primer中文第四版(非扫描)》 1.第369页有这么一句“。 正如前面第 7.8 节所提到的,当形参以副本传递时,不能基…...