Spring学习
Maven 的配置文件是一个强约定的XML格式文件,它的文件名一定是pom.xml
。
1、POM (Project Object Model)
一个 Java 项目所有的配置都放置在 POM 文件中,大概有如下的行为:
- 定义项目的类型、名字
- 管理依赖关系
- 定制插件的
1.maven坐标
<groupId></groupId>
<artifactId>app</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
这四个标签组成了 Maven 的坐标,所谓坐标就是一种位置信息,Maven 的坐标决定了这个 Maven 工程部署后存在 Maven 仓库的文件位置,所以这个坐标信息是必须要指定的。
groupId
groupId 就像一个文件夹一样,它的命名和 Java 的包比较一致,这里一般只用小写的英文字母和字符。
artifactId
artifactId 有点像文件名一样,在一个 groupId 内,它应该是唯一的,你不能使用中文或者特殊字符,从规范上来说只能使用小写的英文字母、.
、-
、_
。比如:app、member.shared
这些都可以
packaging
Maven 工程执行完后会把整个工程打包成packaging
指定的文件格式,默认情况下packaging
的值是jar
,所以如果pom.xml
文件中没有声明这个标签,那就是 jar
packaging 有如下的几种格式
- jar
- war
- ear
- pom
多数情况下,我们使用的都是jar。
version
-
SNAPSHOT 这个单词翻译过来的意思是快照,实际上代表了当前程序还处于不稳定的阶段,随时可以再修改,所以在我们开发的时候我们会在版本号后面加上
SNAPSHOT
关键字 -
RELEASE RELEASE 和 SNAPSHOT 是对立面的,所以它代表的就是稳定,一般我们正式发布的时候,都会把 version 改为
RELEASE
。当然你可以不用特意的加上RELEASE
,因为只要不是SNAPSHOT
,那就是RELEASE
在软件工程里,我们一般会用三位数字来表示版本号,所以大概是x.x.x
这样的格式,比如说 iPhone 11 搭配的操作系统的版本是iOS 13.1.2
,正如你所想的这是一个 RELEASE 版本 。
-
第一位代表的是主版本号
主版本号一般是团队约定来的,上面 iOS 的例子中
13
就是主版本号 -
第二位代表的是新增功能
上面例子中的
1
代表的就是新增功能后的版本,这个数字表明苹果在 13 这个版本里,有了 1 次新增功能的行为 -
第三位代表的是 bugfix 后的版本
bugfix 是修复代码缺陷、bug 的行为,我们知道苹果经常会发布一些版本用于修复问题,所以上面的
2
就是 bugfix 版本,从这个数字你可以大致判断,苹果做了两次 bug 修复
1.2 Maven 属性配置
<properties><java.version>1.8</java.version><maven.compiler.source>${java.version}</maven.compiler.source><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.target>${java.version}</maven.compiler.target>
</properties>
首先它的格式是在properties
标签内,这个是固定的格式。properties内的标签可以自定义,但是一般来说只能是小写英文字母+.
- java.version
代表设置一个参数:
java.version
,它的值是1.8
- maven.compiler.source
这个参数是指定 Maven 编译时候源代码的 JDK 版本,
${java.version}
这个值有点特殊,它是一个动态值,${key}
这个语法会动态找到key
这个参数配置的值,所以上面的例子中${java.version}
的实际值是1.8
- project.build.sourceEncoding
这个参数指定的是工程代码源文件的文件编码格式,一般情况下,我们都设置成
UTF-8
- maven.compiler.target
这个参数作用是是按照这个值来进行编译源代码,比如这里的例子是按照 JDK1.8 进行编译
1、依赖管理 dependencies
dependency 就是用于指定当前工程依赖其他代码库的,Maven 会自动管理 jar 依赖
一旦我们在 pom.xml 里声明了 dependency 信息,会先去本地用户目录下的
.m2
文件夹内查找对应的文件,如果没有找到那么就会触发从中央仓库下载行为,下载完会存在本地的.m2
文件夹内
<dependencies><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.62</version></dependency>
</dependencies>
一个 pom.xml 只能存在一个 dependencies 标签,可以有多个 dependency,因为我们很有可能依赖多个库。
1.1中央仓库
Maven 会把所有的 jar 都存放在中央仓库里,我们可以通过 Maven Central Repository Search 这个网站来搜索 jar。阿里云的镜像服务器 仓库服务https://maven.aliyun.com/mvn/search1.2间接依赖
如果一个remote
工程依赖了 okhttp 库,而当前工程locale
依赖了 remote
工程,这个时候locale
工程也会自动依赖了 okhttp .
2、插件体系 plugins
<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version></plugin></plugins>
</build>
spring工程
spring的maven坐标
<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.6.RELEASE</version>
</dependency>
Spring 强调的是面向接口编程,所以大多数情况下 Spring 代码都会有接口和实现类。
Spring 最大的价值,完全的屏蔽了实现细节,让使用者可以专注与接口的定义和运用即可。
在 Spring 当中,我们如果想调用MessageService
就可以直接从上下文获取,而不需要关心它的实现类、如何实例化实现类,从而达到了真正的解耦合。
Annotation (注解)
Java的注解是一种元数据,可以用来为程序代码添加信息和标记。注解在Java中以@
符号开头,用于提供给编译器、解释器或其他工具一些额外的信息。注解可以用于类、方法、字段等各种程序元素上,以便在运行时或编译时执行特定的操作。
本质上来说 Annotation(注解) 是 Java 推出的一种注释机制,后面我们统一叫 Annotation,和普通的注释有个显著的特别,那就是 Annotation 是可以在编译、运行阶段读取的,注释很明显不可以。
能够在编译、运行阶段读取信息,这就给了我们很多的扩展空间,而且不会污染源代码。我们可以借助它来实现一些增强功能,在 Spring 当中就重度使用了 Annotation,通过运行阶段动态的获取 Annotation 从而完成很多自定义的行为。
从另外一个角度来看,Annotation 也是一个 Java 类,只是这个类太特殊了点。
一个 Annotation 是由多个 Annotation 组合而成的。
1、Target
java.lang.annotation.Target
自身也是一个注解,它只有一个数组属性,用于设定该注解的目标范围,比如说可以作用于类或者方法等。因为是数组,所以可以同时设定多个范围
具体可以作用的类型配置在 java.lang.annotation.ElementType
枚举类中。
- ElementType.TYPE
可以作用于 类、接口类、枚举类上
- ElementType.FIELD
可以作用于类的属性上
- ElementType.METHOD
可以作用于类的方法上
- ElementType.PARAMETER
可以作用于类的参数
2、Retention
java.lang.annotation.Retention
自身也是一个注解,它用于声明该注解的生命周期,简单的来说就是在 Java 编译、运行的哪个环节有效,它的值定义在java.lang.annotation.RetentionPolicy
枚举类中,有三个值可以选择.
1.SOURCE: 也就是说是纯注释作用 2.CLASS: 也就是在编译阶段是有效的 3.RUNTIME: 在运行时有效.
@Retention(RetentionPolicy.RUNTIME)
3、Documented
java.lang.annotation.Documented
自身也是一个注解,它的作用是将注解中的元素包含到 JavaDoc 文档中,一般情况下,都会添加这个注解的.
4、@interface
@interface
就是声明当前的 Java 类型是 Annotation,固定语法,就是这样写就好.
5、Annotation 属性
String value() default "";
Annotation 的属性有点像类的属性一样,它约定了属性的类型(这个类型是基础类型:String、boolean、int、long),和属性名称(默认名称是 value ,在引用的时候可以省略),default 代表的是默认值。
静态码
静态代码块的语法比较特殊,不像方法一样,没有参数也没有返回值。只要在类代码中写 static {}
就好,系统加载这个类的时候,会自动执行静态代码块中的代码。
,既然称之为“静态”代码块,就意味着无论这个类被实例化多少次(new Hello()
),静态代码块都只执行一次。
记住:静态代码块要写在类中,而不能写在方法中
Spring Bean
在 Spring 的世界中,所有的 Java 对象都会通过 IoC 容器转变为 Bean(Spring 对象的一种称呼,以后我们都用 Bean 来表示 Java 对象),构成应用程序主干和由 Spring IoC 容器管理的对象称为 beans,beans 和它们之间的依赖关系反映在容器使用的配置元数据中。基本上所有的 Bean 都是由接口+实现类完成的,用户想要获取 Bean 的实例直接从 IoC 容器获取就可以了,不需要关心实现类.
Spring 主要有两种配置元数据的方式,一种是基于 XML、一种是基于 Annotation 方案的,
Annotation 类型的 IoC 容器对应的类是
org.springframework.context.annotation.AnnotationConfigApplicat
AnnotationConfigApplicationContext
这个类的构造函数有两种
- AnnotationConfigApplicationContext(String ... basePackages) 根据包名实例化
- AnnotationConfigApplicationContext(Class clazz) 根据自定义包扫描行为实例化
只要我们在类上引用这类注解,那么都可以被 IoC 容器加载
@Component
注解是通用的 Bean 注解,其余三个注解都是扩展自Component
@Service
正如这个名称一样,代表的是 Service Bean@Controller
作用于 Web Bean@Repository
作用于持久化相关 Bean
实际上这四个注解都可以被 IoC 容器加载,一般情况下,我们使用@Service
;如果是 Web 服务就使用@Controller
加注解的作用,是让 Spring 系统 自动 管理 各种实例。
所谓 管理 ,就是用 @Service
注解把 SubjectServiceImpl
和 SongServiceImpl
等等所有服务实现,都标记成 Spring Bean ;然后,在任何需要使用服务的地方,用 @Autowired
注解标记,告诉 Spring 这里需要注入实现类的实例。
@Service
和 @Autowired
是相辅相成的:如果 SongServiceImpl 没有加 @Service
,就意味着没有标记成 Spring Bean ,那么即使加了 @Autowired
也无法注入实例;而 private SongService songService;
属性忘记加 @Autowired
,Spring Bean 亦无法注入实例。二者缺一不可。
spring resource
Maven 执行 package 的时候,会把resources目录下的文件一起打包进 jar 包里( jar 是 Java 的压缩文件)。
jar文件是从包路径
开始的。Maven 工程编译后,会自动去掉 src/main/java。
src/main/resources
目录.
classpath
在 Java 内部当中,我们一般把文件路径称为 classpath,所以读取内部的文件就是从 classpath 内读取,classpath 指定的文件不能解析成 File 对象,但是可以解析成 InputStream,可以借助 Java IO读取出来了。
classpath 类似虚拟目录,它的根目录是从 /
开始代表的是 src/main/java
或者src/main/resources
目录
读取文件可以使用commons-io库
<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version>
</dependency>
public class Test {public static void main(String[] args) {// 读取 classpath 的内容InputStream in = Test.class.getClassLoader().getResourceAsStream("data.json");// 使用 commons-io 库读取文本try {String content = IOUtils.toString(in, "utf-8");System.out.println(content);} catch (IOException e) {// IOUtils.toString 有可能会抛出异常,需要我们捕获一下e.printStackTrace();}}}
InputStream in = Test.class.getClassLoader().getResourceAsStream("data.json");
这段代码的含义就是从 Java 运行的类加载器(ClassLoader)实例中查找文件,Test.class
指的当前的 Test.java 编译后的 Java class 文件。
在 Spring 当中定义了一个 org.springframework.core.io.Resource
类来封装文件,这个类的优势在于可以支持普通的 File 也可以支持 classpath 文件。
并且在 Spring 中通过 org.springframework.core.io.ResourceLoader
服务来提供任意文件的读写,你可以在任意的 Spring Bean 中引入 ResourceLoader.
public interface FileService {String getContent(String name);}
实现类
import fm.douban.service.FileService;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.stereotype.Service;import java.io.IOException;
import java.io.InputStream;@Service
public class FileServiceImpl implements FileService {@Autowiredprivate ResourceLoader loader;@Overridepublic String getContent(String name) {try {InputStream in = loader.getResource(name).getInputStream();return IOUtils.toString(in,"utf-8");} catch (IOException e) {return null;}}
}
FileService fileService = context.getBean(FileService.class);String content = fileService.getContent("classpath:data/urls.txt");System.out.println(content);
在 Spring Resource 当中,把本地文件、classpath文件、远程文件都封装成 Resource 对象来统一加载。
流程
init方法, 通过注解来声明 init 。
import javax.annotation.PostConstruct;@Service
public class SubjectServiceImpl implements SubjectService {@PostConstructpublic void init(){System.out.println("启动啦");}}
方法上添加@PostConstruct
注解,就代表该方法在 Spring Bean 启动后会自动执行。
相关文章:

Spring学习
Maven 的配置文件是一个强约定的XML格式文件,它的文件名一定是pom.xml。 1、POM (Project Object Model) 一个 Java 项目所有的配置都放置在 POM 文件中,大概有如下的行为: 定义项目的类型、名字管理依赖关系定制插件的 1.maven坐标 <…...

鸿蒙开发-UI-动画-组件内转场动画
鸿蒙开发-UI-组件3 鸿蒙开发-UI-气泡/菜单 鸿蒙开发-UI-页面路由 鸿蒙开发-UI-组件导航-Navigation 鸿蒙开发-UI-组件导航-Tabs 鸿蒙开发-UI-图形-图片 鸿蒙开发-UI-图形-绘制几何图形 鸿蒙开发-UI-图形-绘制自定义图形 鸿蒙开发-UI-图形-页面内动画 文章目录 前言 一、基本概…...

Leet code 179 最大数
解题思路 贪心算法 贪心算法就是走一步看一步 每一步都取当前位置的最优解 这题我们该如何贪呢? 我们先把int数组转换为string数组 以示例2为例 3 30 34 5 9 排序哪个在前哪个在后? 3 30 (330)> 30 3 (30…...

swagger踩坑之请求类不显示具体字段
swagger踩坑之请求类不显示具体字段 省流:枚举字段需要加上ApiModelProperty注解 过程复现: TestEnum 枚举不加注解,swagger的UI类不显示详细字段 Data Accessors(chain true) ApiModel(value "test对象", description &quo…...

案例分析篇14:信息系统安全设计考点(2024年软考高级系统架构设计师冲刺知识点总结系列文章)
专栏系列文章推荐: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html 【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-…...

前端之用HTML弄一个古诗词
将进酒 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>将进酒</title><h1><big>将进酒</big> 君不见黄河之水天上来</h1><table><tr><td ><img…...

Linux 安装使用 Docker
目录 一、前提卸载命令:执行情况: 二、安装 Docker1. 通过仓库进行安装(在线方式)1.1 设置存储库1.2 查看可安装版本1.3 安装 Docker1.4 启动 Docker1.5 验证是否成功 2. 通过 RMP 包安装(离线方式)2.2 安装…...

Doris部署学习(一)
目录 前言 一、Docker容器支持 二、Doris编译步骤 1.拉取镜像 2.构建Docker编译容器 3.下载源码并编译 前言 本文档主要介绍如何通过源码在Docker编译 Doris,以及部署。 一、Docker容器支持 Docker教程:Docker & Docker-Compose 安装教程 - 知…...

QT下跨平台库实现及移植经验分享
最近在移植公司一个QT桌面软件到android上,有一些公司自定义的库,用了很多windows的api,移植过程很是曲折,在此有一些感悟分享一下~ 一.自编写跨平台库 1.有时候为了程序给第三方用需要编译一些qt封装库,并可能跨平台…...

8:00面试,8:06就出来了,问的问题有点变态。。。
从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到9月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%…...

Rust 利用 Trait 实现多态性
在Rust中,Trait(特性)是一种强大的抽象机制,类似于其他编程语言中的接口或类型类。它们允许你定义一组方法,这些方法可以在任何实现该Trait的类型上调用。这使得Rust能够以一种非常灵活的方式支持多态性。 下面是一个…...

Java毕业设计-基于springboot开发的“智慧食堂”设计与实现-毕业论文+答辩PPT(附源代码+演示视频)
文章目录 前言一、毕设成果演示(源代码在文末)二、毕设摘要展示1.开发说明2.需求分析3、系统功能结构 三、系统实现展示1、系统登录2、系统功能模块3、管理员功能模块 四、毕设内容和源代码获取总结 Java毕业设计-基于springboot开发的“智慧食堂”设计与…...

一瓶5.86万,听花酒什么来头?
听花酒,到底什么来头? 宣称有提升免疫力、改善睡眠、保障男性功能、调节生理紊乱、抗衰老等功效的听花酒,被315晚会曝光了。 相关话题词随即冲上了热搜。之后,售价最高达58600元的听花酒被京东、拼多多、淘宝等电商平台火速下架…...

代码随想录 二叉树—填充每个节点的下一个右侧结点指针
今天没精力看了 题解c: class Solution { public:Node* connect(Node* root) {if (root NULL) return NULL; // 基本情况queue<Node*> q;q.push(root);while (!q.empty()) {int size q.size();Node* prev NULL;for (int i 0; i < size; i) {Node* no…...

用 bsdtar 做 Linux 全系统迁移 - 最省空间、最灵活的Linux系统迁移方式,但需要那么一点点技巧
(首发地址:学习日记 https://www.learndiary.com/2024/03/migrate-linux-with-bsdtar/ ) 我们在做 Linux 全系统迁移的时候,可以直接备份磁盘或分区(如 dd ),也可以备份全部文件(如…...

【模拟string函数的实现】
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 模拟string函数的实现 浅拷贝 深拷贝 vs和g下string结构的说明 总结 前言 模拟string函数的实现 浅拷贝 深拷贝 总结 前言 世上有两种耀眼的光芒&#…...

智能合约开发基础知识:最小信任机制、智能合约、EVM
苏泽 大家好 这里是苏泽 一个钟爱区块链技术的后端开发者 本篇专栏 ←持续记录本人自学两年走过无数弯路的智能合约学习笔记和经验总结 如果喜欢拜托三连支持~ 专栏的前面几篇详细了介绍了区块链的核心基础知识 有兴趣学习的小伙伴可以看看http://t.csdnimg.cn/fCD5E关于区块…...

程序人生——Java泛型和反射的使用建议
目录 引出泛型和反射建议93:Java的泛型是类型擦除的建议94:不能初始化泛型参数和数组建议95:强制声明泛型的实际类型 建议96:不同的场景使用不同的泛型通配符建议97:警惕泛型是不能协变和逆变的 建议98:建议…...

JavaSE-----认识异常【详解】
目录 一.异常的概念与体系结构: 1.1异常的概念: 1.2一些常见的异常: 1.3异常的体系结构: 1.4异常的分类: 二.异常的处理机制: 2.1 抛出异常: 2.2异常的捕获: 2.3try-catch-&…...

【机器学习300问】34、决策树对于数值型特征如果确定阈值?
还是用之前的猫狗二分类任务举例(这个例子出现在【机器学习300问】第33问中),我们新增一个数值型特征(体重),下表是数据集的详情。如果想了解更多决策树的知识可以看看我之前的两篇文章: 【机器…...

计算机二级(Python)真题讲解每日一题:《绘制雪花》
在横线处填写代码,完成如下功能…...

Rust 的 Arc<Mutex<T>> 的用法示例源代码
在 Rust 中,Arc<Mutex<T>> 是一种组合类型,它结合了 Arc(原子引用计数)和 Mutex(互斥锁)。Arc 用于在多个所有者之间共享数据,而 Mutex 用于确保在任意时刻只有一个线程可以访问被保…...

【NR 定位】3GPP NR Positioning 5G定位标准解读(十六)-UL-AoA 定位
前言 3GPP NR Positioning 5G定位标准:3GPP TS 38.305 V18 3GPP 标准网址:Directory Listing /ftp/ 【NR 定位】3GPP NR Positioning 5G定位标准解读(一)-CSDN博客 【NR 定位】3GPP NR Positioning 5G定位标准解读(…...

如何理解闭包
闭包是编程语言中一个重要的概念,特别是在函数式编程中常常会遇到。以下是对闭包的理解: 1. 定义: 闭包是一种函数,它引用了在其定义范围之外的自由变量(非全局变量),并且这些引用的变量在函数被调用时仍然保持活跃状态。2. 构成: 闭包通常由两部分组成:内部函数(函…...

python知识点总结(一)
这里写目录标题 一、什么是WSGI,uwsgi,uWSGI1、WSGI2、uWSGI3、uwsgi 二、python中为什么没有函数重载?三、Python中如何跨模块共享全局变量?四、内存泄露是什么?如何避免?五、谈谈lambda函数作用?六、写一个函数实现字符串反转,尽可能写出你知道的所…...

【Poi-tl Documentation】区块对标签显示隐藏改造
前置说明: <dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.12.1</version> </dependency>模板: 删除行表格测试.docx 改造前测试效果 package run.siyuan…...

第十四届蓝桥杯 三国游戏
一开始的思路就是想着暴力,但是呢,如果真的用暴力一个一个列的话,连30%的数据都搞定不了,所以这里需要考虑别的办法。 这道题的思路就是贪心。 我们这样想:既然要满足至少一个国X>YZ,那么我们何不变成…...

数据结构——通讯录项目
1.通讯录的介绍 顺序表是通讯录的底层结构。 通讯录是将顺序表的类型替换成结构体类型来储存用户数据,通过运用顺序表结构来实现的。 用户数据结构: typedef struct PersonInfo {char name[12];char sex[10];int age;char tel[11];char addr[100]; }…...

学点Java打小工_Day4_数组_冒泡排序
1 数组基本概念 程序算法数据结构 算法:解决程序的流程步骤 数据结构:将数据按照某种特定的结构来存储 设计良好的数据结构会导致良好的算法。 ArrayList、LinkedList 数组是最简单的数据结构。 数组:存放同一种类型数据的集合,在…...

内存分配方式?
内存分配方式主要有三种: 静态存储区分配:这种方式在程序编译的时候就已经分配好内存,并且这块内存在程序的整个运行期间都存在。全局变量和静态变量通常就是在静态存储区分配的。这种分配方式效率高,因为内存在程序开始执行前就已…...