Spring 的创建和日志框架的整合

目录

一、第一个 Spring 项目

1、配置环境

2、Spring 的 jar 包

Maven 项目导入 jar 包和设置国内源的方法:

3、Spring 的配置文件

4、Spring 的核心 API

ApplicationContext

4、程序开发

5、细节分析

(1)名词解释

(2)Spring 工厂的相关方法

(3)配置文件中的细节

1、只配置 class 属性

2、name 属性

6、Spring 工厂的底层实现原理(简易版) 

7、思考

二、Spring 与 日志框架的整合

1、Spring 如何整合日志框架?


一、第一个 Spring 项目

1、配置环境


2、Spring 的 jar 包

在项目的 porm.xml 中添加 Spring 框架的支持,xml 配置如下:

<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.1.4.RELEASE</version>
</dependency>

复制的时候注意观察当前的 pom.xml 中是否已经有 dependices

如果 jar 包下载过慢或者下载失败,我们可以设置国内源来解决 

Maven 项目导入 jar 包和设置国内源的方法:

1、打开自己的 idea 检测 maven 的配置是否正确

这两个地方都要进行配置!!!

然后设置 settings 文件:


<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0https://maven.apache.org/xsd/settings-1.0.0.xsd"><mirrors><mirror>  <id>alimaven</id>  <name>aliyun maven</name>  <url>http://maven.aliyun.com/nexus/content/groups/public/</url>  <mirrorOf>central</mirrorOf>          </mirror>  </mirrors>
</settings>

如果电脑中没有 settings 文件,就自己创建一个,如果有,就直接在原来的 settings 文件上更改就行

2、如果继续出错,就删除本地 maven 仓库的 jar 包重新下载

3、当前网络运营商有问题,就尝试更换链接的数据源,使用更好的网络,如果还是不行,就间隔一段时间之后再去尝试


3、Spring 的配置文件

1、配置文件的放置位置:任意位置,没有硬性要求

2、配置文件的命名:没有硬性要求,建议叫  applicationContext.xml

接下来,我们思考一个问题:

Spring 框架如何知道开发人员未来会把配置文件放在哪里,叫什么名字呢?

所以,日后应用 Spring 框架时,需要进行配置文件路径的设置

按照图中步骤,在 resourses 下创建好一个文件,并按照建议给它命名为 applicationContext.xml

此时我们就会发现,整个 Spring 的配置文件就帮我们建好了,


4、Spring 的核心 API

ApplicationContext

作用:Spring 提供的 ApplicationContext 这个工厂,主要的作用就是用于对象的创建

好处:解耦合

ApplicationContext 是一个接口类型

接口的主要目的:屏蔽实现的差异(工厂可能会应用到不同的开发场景下,不同的开发场景有不同的特点)

Spring 主要提供两种类型的工厂:

1、非 web 环境:ClassPathXmlApplicationContext(main,junit)

2、web 环境:XmlWebApplicationContext

我们称 ApplicationContext 是一个重量级资源

那么什么是一个重量级资源?

如果一个对象对内存占用的比较多,那么我们就称之为重量级资源

这也就意味着,ApplicationContext 这个工厂的对象,会占用大量的内存

正因为它的内存占用比较多,所以我们不会频繁的创建对象:一个应用只会创建一个工厂对象

也正是因为它有这样的特点,所以这个对象就有可能会出现并发访问(多线程访问)的情况

所以,ApplicationContext 工厂,一定是线程安全的(多线程并发访问)


4、程序开发

Spring 提供的工厂和我们自己写的工厂,本质上是没有差异的,都是解耦合的

那么,对于 Spring 来讲,它的工厂使用,和我们前面所总结的通用工厂的使用方式,本质上是没有区别的

1、创建类型

2、配置文件的配置 applicationContext.xml

3、通过工厂类,获得对象 ApplicationContext

1、创建类型

2、配置文件的配置

我们要在 beans 下面创建一个子标签,里面有两个属性:id 和 class

id 属性:就是起个名字,命名(唯一的)

class 属性:配置所需要创建的文件的全限定名

虽然组织形式不同,但是所需要的要素是完全一样的

通过这步,我们也告诉了 Spring ,需要生产 Person 对象

3、通过工厂类,获得对应的对象

        //用于测试 Spring 的第一个程序public static void test() {//1、获得 Spring 工厂ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");//2、通过工厂类来获得对象Person person = (Person) ctx.getBean("person");System.out.println("person = " + person);}

此时,我们会发现,这个对象的引用打印出来了

说明这个对象由 Spring 的工厂创建完成了


5、细节分析

(1)名词解释

Spring 工厂创建的对象,叫做 bean 或者 组件(componet)


(2)Spring 工厂的相关方法

//通过这种⽅式获得对象,就不需要强制类型转换
Person person = ctx.getBean("person", Person.class);
System.out.println("person = " + person);//当前Spring的配置⽂件中 只能有⼀个<bean class是Person类型
Person person = ctx.getBean(Person.class);
System.out.println("person = " + person);//获取的是 Spring⼯⼚配置⽂件中所有bean标签的id值 
String[] beanDefinitionNames = ctx.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {System.out.println("beanDefinitionName = " +
beanDefinitionName);
}//根据类型获得Spring配置⽂件中对应的id值
String[] beanNamesForType = ctx.getBeanNamesForType(Person.class);
for (String id : beanNamesForType) {System.out.println("id = " + id);
}//⽤于判断是否存在指定id值得bean
if (ctx.containsBeanDefinition("a")) {System.out.println("true = " + true);
}else{System.out.println("false = " + false);
}//⽤于判断是否存在指定id值得bean
if (ctx.containsBean("person")) {System.out.println("true = " + true);
}else{System.out.println("false = " + false);
}

(3)配置文件中的细节

1、只配置 class 属性

<bean class="Person"/>

上述这种配置,有没有 id 值呢?

我们可以借助上面的 ctx.getBeanDefinitionNames(); 来进行观察

我们发现,spring 会自动生成一个 id 的默认值,所以我们没有给它设定 id ,但是实际上还是存在一个 id 与之对应的

应用场景:如果这个 bean 只需要使用一次,那么就可以省略 id 值,反之,如果这个 bean 会使用多次或者被其它 bean 引用,则需要设置 id 值

2、name 属性

用于在 Spring 的配置文件中,为 bean 对象定义别名(小名)

<bean id="person1" name="p" class="Person" ></bean>

id 与 name 相同点:

1、ctx.getBean(" id | name ") ; 都可以获取到对象

2、 < bean id = " " class = " " > 和 < bean name = " " class = " " >二者是等效的

id 和 name 的区别:

1、别名可以定义多个,但是 id 只能是一个

2、XML 的 id 属性的值,命名的时候要求:必须要以字母开头,字母,数字,下划线,连字符,不能以特殊字符开头,比如 / ,而 name 属性的值,在命名的时候,是没有要求的,所以 name 属性会应用在特殊命名的场景下,但是 xml 发展到了今天,id 的属性的限制,已经不存在了

3、代码的区别

//⽤于判断是否存在指定id值得bean,不能判断name值if (ctx.containsBeanDefinition("person")) {System.out.println("true = " + true);}else{System.out.println("false = " + false);}//⽤于判断是否存在指定id值得bean,也可以判断name值if (ctx.containsBean("p")) {System.out.println("true = " + true);}else{System.out.println("false = " + false);}

6、Spring 工厂的底层实现原理(简易版) 

反射的底层是否会调用构造方法呢?

虽然反射创建了对象,但是底层也一定会调用这个对象的构造方法(无参),所以我们也可以认为反射创建对象就等效于我们的 new 创建对象

如果这个构造方法是私有的怎么办呢?

private 修饰的只能在本类调用,而显然 String 是外类

通过代码实验,我们能发现,即使构造方法被设为了私有的,private 的构造方法依旧会被调用

底层还是通过反射来实现的,因为反射能够调用一个类的私有的属性和构造方法,所以 Spring 工厂是可以调用对象私有的构造方法来创建对象的


7、思考

未来在开发过程中,是不是所有的对象都会被交给 Spring 工厂来创建呢?

理论上来说,是的,但是有特例:实体对象(entity)

实体对象是不会交给 Spring 创建的,是由持久层框架来进行创建的。


二、Spring 与 日志框架的整合

Spring 与日志框架整合,日志框架就可以在控制台中输出 Spring 框架运行过程中的一些重要的信息

好处:便于我们了解 Spring 框架的运行过程,利于程序的调试

1、Spring 如何整合日志框架?

Spring 的不同版本,针对于日志框架的整合,以及整合的内容和方式,是有一些区别的

比如:Spring 1.2.3早期的日志框架,都是与 common-logging.jar 这个日志进行整合的

           Spring 5.x 默认整合的日志框架是 logback 或者 log4j2

根据我们的开发需要,我们想让 Spring 5.x 整合 log4j,那么整合 log4j 怎么整合呢?

1、引入 log4j 的 jar 包

2、引入 log4j.properties 配置文件

以 jar 包的方式,我们肯定要通过 maven 来完成,所以我们要设置我们的 pom 文件,那么在 pom 文件中我们要添加对应的依赖

<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.25</version>
</dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version>
</dependency>

第二个配置就是引入 log4j.properties 的配置文件

# resources # resources⽂件夹根⽬录下
### ### 配置根
log4j.rootLogger = debug,console### ### ⽇志输出到控制台显示
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

整合完毕之后再次运行代码,就能发现区别了:

我们会发现,当我们整合日志之后,我们从控制台中看到的内容就不仅仅基于我们打印的,还基于我们 spring 内部运行的

这样的话,在日后解决复杂性问题的时候,我们就可以通过日志,大概可以猜测到 Spring 帮我们做了什么,就更加利于我们后续程序的调试

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uboot 顶层Makefile-make xxx_deconfig过程说明三

一. uboot 的 make xxx_deconfig配置 本文接上一篇文章的内容。地址如下&#xff1a;uboot 顶层Makefile-make xxx_deconfig过程说明二_凌肖战的博客-CSDN博客 本文继续来学习 uboot 源码在执行 make xxx_deconfig 这个配置过程中&#xff0c;顶层 Makefile有关的执行思路。 …

STM32纯中断方式发送接收数据(串行通信;keil arm5;)

除了main文件其他文件均无修改&#xff0c;正常运行--在keil arm5内

AJAX学习笔记9 搜索联想自动补全

AJAX学习笔记8 跨域问题及解决方案_biubiubiu0706的博客-CSDN博客 其实就一个功能 搜索联想 自动补全 键盘按下事件keydown 键盘弹起事件keyup 做模糊查询 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><t…

第9节-PhotoShop基础课程-移动抓手缩放工具

文章目录 前言1. 移动工具1.移动工具1.自动选择&#xff08;图层和组&#xff09;2.显示变换控件 &#xff08;Shift 变换/ Ctrl 变换&#xff09;3.自由变换 Ctrl T &#xff08;Shift 变换/ Ctrl 变换&#xff09;4.对齐功能 2.画板工具 V1. 创建画板并作图2.导出画板 2.路…

59、SpringBoot 自定义JSON的序列化器和反序列化器

Serialization(序列化)&#xff1a; 将java对象以一连串的字节码保存在磁盘文件中的过程&#xff0c;也可以说是保存java对象状态的过程。序列化可以将数据永久保存在磁盘上(通常保存在文件中)。 deserialization(反序列化)&#xff1a; 将保存在磁盘文件中的java字节码重新转…

Jmx协议远程连接java服务器

注意&#xff1a;本例里&#xff0c;我用的是jdk17 通常用jdk自带的jconsole&#xff0c;或者想要功能强大点的使用visualVM 需要java服务器在启动的时候加上以下参数 -Dcom.sun.management.jmxremote 启用jxm远程连接-Djava.rmi.server.hostname10.1.3.99 指定jxm监听地址&…

python 自(1)定义变量 数据类型 判断数据类型 转换数据类型 算数运算符 复合运算符 比较运算符 逻辑运算符 赋值运算符

注释 # 注释 就是一个 # 也可以 ctrl / 也可以出来注释 命名规范 # 标识符 由字母 下划线 数字 组成 数字不能开头 # 不可以使用 关键字 # 严格区分大小写 定义变量 # 变量定义 重复利用 # 例如 cons 你好小周 print(cons) print(cons)print("你好小周") #这…

【经典小练习】JavaSE—拷贝文件夹

&#x1f38a;专栏【Java小练习】 &#x1f354;喜欢的诗句&#xff1a;天行健&#xff0c;君子以自强不息。 &#x1f386;音乐分享【如愿】 &#x1f384;欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f384;效果&#x1f33a;代码&#x1f6f8;讲解&#x…

每日一题 2596. 检查骑士巡视方案

难度&#xff1a;中等 很简单&#xff0c;从第 0 步开始模拟即可&#xff0c;唯一sb的就是测试用例中如果&#xff08;0&#xff0c;0&#xff09;处不为0的话就直接false&#xff0c;而不是去找0在哪 我的代码&#xff1a; class Solution:def checkValidGrid(self, grid: L…

【PowerQuery】Excel的PowerQuery的复制

在Excel中构建符合要求的PowerQuery连接之后&#xff0c;所有的PowerQuery 连接已经顺利的保存在Excel 工作簿当中&#xff0c;但是如何去查看已经保存的PowerQuery连接呢&#xff1f;图6.3 显示了查看PowerQuery连接。 Excel界面->数据页签->查询与连接 如果你的Power…

python求解一维弦振动方程

1、一维弦振动方程 2、差分公式及求解 import numpy as np import matplotlib.pyplot as plt l1 #长度 nx 101 #x方向网格节点数量 dx l/(nx-1) #空间网格步长 t6 #总时间 dt 0.01 # 时间步长 t_setnp.array([0.00,0.10,0.20,0.30,0.40,0.50,0.60]) #需要观察的时…

GO语言篇之发布开源软件包

GO语言篇之发布开源软件包 文章目录 GO语言篇之发布开源软件包新建仓库拉取到本地初始化项目编写代码提交代码发布引用软件包 我们写GO语言程序的时候难免会引用第三方的软件包&#xff0c;那么你知道别人是怎么发布自己的软件包吗&#xff0c;别急&#xff0c;这篇博客教你怎么…

如何使用 Node.js和Express搭建服务器?

如何使用NodeJs搭建服务器 1. 准备工作1.1 安装Node.js 2. 安装express2.1 初始化package.json2.2 安装express2.3 Express 应用程序生成器 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段…

geohash学习

geohash编解码 import ("github.com/mmcloughlin/geohash" )func Test_Demo(t *testing.T) {// 编码经纬度到 geohash 字符串lat, lon : 40.7128, -74.0060 // 纽约市的位置geoHash : geohash.Encode(lat, lon) // geohash 字符串fmt.Println(geoHash) …

Spring WebFlux详解

Spring 框架中包含的原始 Web 框架 Spring Web MVC 是专门为 Servlet API 和 Servlet 容器而设计的。后来在 5.0 版本中加入了 reactive 栈的 Web 框架 Spring WebFlux。它是完全非阻塞的&#xff0c;支持 Reactive Streams 背压&#xff0c;并在 Netty、Undertow 和 Servlet 容…

lv4 嵌入式开发-1 Linux文件IO

目录 1 文件的概念和类型 2 如何理解标准IO 3 流(FILE)的含义 3.1 流 3.2 文本流和二进制流 3.3 流的缓冲类型 4 小结 5 缓存区实验 1 文件的概念和类型 概念&#xff1a;一组相关数据的有序集合 文件类型&#xff1a; 常规文件 r 目录文件 d 字符设备文件 …

一键部署k8s集群

前置动作 关闭防火墙 systemctl disable firewalld && systemctl stop firewalld 关闭SELinux sed -i s#SELINUXenforcing#SELINUXdisabled#g /etc/selinux/config && grep SELINUXdisabled /etc/selinux/config setenforce 0 getenforce 关闭swap # 关闭…

Unity3D URP 仿蜘蛛侠风格化BloomAO

Unity3D URP 仿蜘蛛侠风格化Bloom&AO BloomBloom效果流程&#xff1a;制作控制面板VolumeComponent.CSCustom Renderer FeatherCustom Renderer PassBloom ShaderComposite Shader 完善Custom Feather风格化AO 总结 本篇文章介绍在URP中如何进行风格化后处理&#xff0c;使…

做题(2)

1.command_execution 题目提示&#xff1a; (这道题的名字就叫命令执行漏洞) 发现ping 先rce一下 127.0.0.1 | ls 发现了东西 尝试访问一下 找到了所有的文件 访问var文件夹 发现在var/www/html目录下没找到 去别的地方找找 在home文件夹下找到flag文件 访问 得到flag cyb…

网络层--IP协议

引入&#xff1a; IP协议主要解决什么问题呢&#xff1f; IP协议提供一种将数据从主机&#xff21; 发送到 主机&#xff22;的能力。&#xff08;有能力不一定能做到&#xff0c;比如小明很聪明&#xff0c;可以考100分&#xff0c;但是他也不是每次搜能考100分&#xff0…