2、Spring6 入门

news2024/10/4 9:25:37

1、环境要求

  • JDK:Java17+(Spring6要求JDK最低版本是Java17)

  • Maven:3.6+

  • Spring:6.0.2

2、构建模块

2.1 构建父模块spring6

点击“Create”

 

2.2 构建子模块spring-first

 

点击 Create 完成.

3、程序开发

3.1 引入依赖

 

<dependencies>
    <!--spring context依赖-->
    <!--当你引入Spring Context依赖之后,表示将Spring的基础依赖引入了-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>6.0.11</version>
    </dependency>

    <!--junit5测试-->
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>5.3.1</version>
    </dependency>
</dependencies>

查看依赖:

3.2 创建java类

package com.jie.spring6;

/**
 * @author Administrator
 */
public class HelloWorld {

    public void sayHello() {
        System.out.println("helloworld");
    }
}

 

3.3 创建配置文件

在resources目录创建一个 Spring 配置文件 bean.xml(配置文件名称可随意命名,如:springs.xml)

 以前我们创建对象的方式是通过

 HelloWorld helloWorld = new HelloWorld();

的方式,但是现在我们可以把创建对象的这个过程,在spring中进行实现。

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--
      配置HelloWorld所对应的bean,即将HelloWorld的对象交给Spring的IOC容器管理
      通过bean标签配置IOC容器所管理的bean
      属性:
          id:设置bean的唯一标识
          class:设置bean所对应类型的全类名
    -->
    <bean id="helloWorld" class="com.jie.spring6.HelloWorld"/>

</beans>

 3.4 创建测试类测试

 

package com.jie.spring6;

import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author JIE
 * @version 1.0
 * @description: 测试类
 * @date 2023/8/30 9:20
 */
public class HelloWorldTest {

    @Test
    public void testHelloWorld() {
        // 创建一个ClassPathXmlApplicationContext对象,加载名为beans.xml的配置文件
        ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");

        // 获取名为helloWorld的Bean
        HelloWorld helloworld = (HelloWorld) ac.getBean("helloWorld");

        // 调用sayHello方法
        helloworld.sayHello();
    }

}

3.5 运行测试程序

 

4、程序分析

第一个问题:spring 底层是如何创建对象的,是通过反射机制调用无参构造方法吗?

首先修改HelloWorld类:

package com.jie.spring6;

/**
 * @author Administrator
 */
public class HelloWorld {

    public HelloWorld() {
        System.out.println("无参构造方法调用");
    }


    public void sayHello() {
        System.out.println("helloworld");
    }
}

 执行测试结果:

测试得知:创建对象时确实调用了无参数构造方法。

那 Spring是如何创建对象的呢?原理是什么?

打开我们的测试类。

 

然后我们点开bean.xml 。spring 会如何解析我们的xml文件内容呢?

 

我们这个bean标签是不是有id (唯一标识),class 是 类的全路径。

那我们拿到的类的全路径,接下来可以做什么?

那就是我们的 第四步 使用反射根据类的全路径创建对象。
 

 Class clazz = Class.forName("com.jie.spring6.HelloWorld");
 //Object obj = clazz.newInstance();
 Object object = clazz.getDeclaredConstructor().newInstance();

接下来就是创建完对象后,对象存放在哪里?

bean对象最终存储在spring容器中,在spring源码底层就是一个map集合,存储bean的map在DefaultListableBeanFactory类中:

我们 在 idea 中 按两下 shift 。

 在弹出的窗口中输入 DefaultListableBeanFactory。然后选择 DefaultListableBeanFactory.java 就能跳到 DefaultListableBeanFactory 类中了,在这个类中我们找到 beanDefinitionMap 这个属性。

Spring容器加载到Bean类时 , 会把这个类的描述信息, 以包名加类名的方式存到beanDefinitionMap 中, Map<String,BeanDefinition> , 其中 String是Key , 默认是类名首字母小写 , BeanDefinition , 存的是类的定义(描述信息) , 我们通常叫BeanDefinition接口为 : bean的定义对象。

5、启用Log4j2日志框架

5.1 Log4j2日志概述

在项目开发中,日志十分的重要,不管是记录运行情况还是定位线上问题,都离不开对日志的分析。

日志记录了系统行为的时间、地点、状态等相关信息,能够帮助我们了解并监控系统状态,在发生错误或者接近某种危险状态时能够及时提醒我们处理,同时在系统产生问题时,能够帮助我们快速的定位、诊断并解决问题。

Apache Log4j2是一个开源的日志记录组件,使用非常的广泛。

在工程中以易用方便代替了 System.out 等打印语句,它是JAVA下最流行的日志输入工具。

Log4j2主要由几个重要的组件构成:

  1. 日志信息的优先级,日志信息的优先级从高到低有TRACE < DEBUG < INFO < WARN < ERROR < FATAL

    1. TRACE:追踪,是最低的日志级别,相当于追踪程序的执行

    2. DEBUG:调试,一般在开发中,都将其设置为最低的日志级别

    3. INFO:信息,输出重要的信息,使用较多

    4. WARN:警告,输出警告的信息

    5. ERROR:错误,输出错误信息

    6. FATAL:严重错误

  2. 这些级别分别用来指定这条日志信息的重要程度;级别高的会自动屏蔽级别低的日志,也就是说,设置了WARN的日志,则INFO、DEBUG的日志级别的日志不会显示

  3. 日志信息的输出目的地,日志信息的输出目的地指定了日志将打印到控制台还是文件中

  4. 日志信息的输出格式,而输出格式则控制了日志信息的显示内容。

5.2 引入Log4j2依赖

 <!--log4j2的依赖-->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.20.0</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j2-impl</artifactId>
    <version>2.20.0</version>
</dependency>

 

5.3 加入日志配置文件

在类的根路径下提供log4j2.xml配置文件(文件名固定为:log4j2.xml,文件必须放到类根路径下。)

 

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <loggers>
        <!--
            level指定日志级别,从低到高的优先级:
                TRACE < DEBUG < INFO < WARN < ERROR < FATAL
                trace:追踪,是最低的日志级别,相当于追踪程序的执行
                debug:调试,一般在开发中,都将其设置为最低的日志级别
                info:信息,输出重要的信息,使用较多
                warn:警告,输出警告的信息
                error:错误,输出错误信息
                fatal:严重错误
        -->
        <root level="DEBUG">
            <appender-ref ref="spring6log"/>
            <appender-ref ref="RollingFile"/>
            <appender-ref ref="log"/>
        </root>
    </loggers>

    <appenders>
        <!--输出日志信息到控制台-->
        <console name="spring6log" target="SYSTEM_OUT">
            <!--控制日志输出的格式-->
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss SSS} [%t] %-3level %logger{1024} - %msg%n"/>
        </console>

        <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,适合临时测试用-->
        <File name="log" fileName="F:/zuoMian/logs/test.log" append="false">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
        </File>

        <!-- 这个会打印出所有的信息,
            每次大小超过size,
            则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,
            作为存档-->
        <RollingFile name="RollingFile" fileName="F:/zuoMian/logs/app.log"
                     filePattern="log/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
            <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
            <SizeBasedTriggeringPolicy size="50MB"/>
            <!-- DefaultRolloverStrategy属性如不设置,
            则默认为最多同一文件夹下7个文件,这里设置了20 -->
            <DefaultRolloverStrategy max="20"/>
        </RollingFile>
    </appenders>
</configuration>

这种文件内容格式网上有很多,大家可以直接去搜索一下,然后 复制 + 粘贴 使用即可。

5.4 测试

运行原测试程序

 

运行原测试程序,多了spring打印日志。

5.5 使用日志
 

package com.jie.spring6;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author Administrator
 */
public class HelloWorld {

    private Logger logger = LoggerFactory.getLogger(HelloWorldTest.class);

    public HelloWorld() {
        logger.info("无参构造方法调用");
    }


    public void sayHello() {
        logger.info("HelloWorld");
    }
}

 

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

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

相关文章

Garmin 佳明Venu 3系列内置睡眠教练,掌握好眠关键

Venu 3 系列智能运动健康腕表搭载全新睡眠教练&#xff0c;培养健康睡眠习惯; 进阶版身体电量&#xff0c;冥想指南&#xff0c;打造全天候健康生活续航 【2023年8月31日】佳明&#xff08;纽交所代码&#xff1a;GRMN&#xff09;发布Venu 3及Venu 3S智能运动健康腕表&#…

速卖通运营干货:如何利用测评养号实现店铺增长突破?

做过速卖通运营的卖家都知道爆款、标题、转化、后台数据这几个店铺运营关键词&#xff0c;是每位速卖通运营者都无法避开的。当中的每一个步骤的变化对于你的店铺都可能带来翻天地覆的变化。 可以这么说&#xff0c;以上的之间都是紧密联系在一起&#xff0c;更是一环扣一环&a…

景联文科技:高质量AI数据标注助力大语言模型训练,推动人工智能落地应用

大语言模型在各类LLM新技术的融会贯通下&#xff0c;不断加速Instruction-tuning、RLHF、思维链等新技术在大语言模型中的深度应用&#xff0c;人工智能技术以惊人的速度不断进化。 大语言模型&#xff08;LLM&#xff09;是一种基于深度学习技术和海量文本数据&#xff0c;它们…

室外定位|GPS模块选型,GPS模块应用_SKYLAB

定位技术作为物联网的一项重要感知技术,借助其获取物体的即时位置信息,可以衍生一系列基于位置信息的物联网应用。 随着智慧城市与新基建的发展&#xff0c;对精准的定位技术需求更加迫切。物体的位置实时变化&#xff0c;采集的其他信息通常必须与位置信息关联才有价值。本篇S…

Kafka系列六集群管理

文章首发于个人博客&#xff0c;欢迎访问关注&#xff1a;https://www.lin2j.tech 集群 Kafka 在搭建集群的时候需要借助 Zookeeper 来进行集群成员&#xff08;Brokers&#xff09;的管理。每一个 Broker 都有一个唯一标识 broker.id&#xff0c;用于自己在集群中的身份标识…

问道管理:“出海”势头强劲 A股公司半年报彰显中国制造全球竞争力

“出海”是2023年我国企业开展的关键词之一。从国内企业组团出海抢订单&#xff0c;到我国出口“新三样”&#xff0c;上半年的多项经济热门、亮点均与出海相关。 上市公司2023年半年报亦折射企业出海的积极改变。Choice数据显示&#xff0c;到记者发稿时已披露半年报的4566家…

M1卡控制位解析

一、M1卡介绍 非接触式传输数据和供电 工作频率为 13.56 MHz 16 位 CRC 数据完整性检验、奇偶校验、位编码、位计数 典型票务交易时间小于 100 毫秒&#xff08;包括备份管理&#xff09; 支持随机 ID&#xff08;7 字节 UID 版本&#xff09; 工作距离可达…

Linux之web服务器

目录 www简介 常见Web服务程序介绍 服务器主机 主要数据 浏览器 网址及HTTP简介 URL http请求方法 状态码 MIME&#xff08;Multipurpose Internet Mail Extension&#xff09; www服务器的类型 静态网站 动态网站 Apache服务的搭建 Apache的安装 准备工作 htt…

【Flutter】Flutter 使用 collection 优化集合操作

【Flutter】Flutter 使用 collection 优化集合操作 文章目录 一、前言二、安装和基本使用三、算法介绍四、如何定义相等性五、Iterable Zip 的使用六、优先队列的实现和应用七、包装器的使用八、完整示例九、总结 一、前言 大家好&#xff01;我是小雨青年&#xff0c;今天我要…

【LeetCode-中等题】105. 从前序与中序遍历序列构造二叉树

文章目录 题目方法一&#xff1a;递归 题目 方法一&#xff1a;递归 preorder [3,9,20,15,7] inorder [9,3,15,20,7] 首先根据 preorder 找到根节点是 3然后根据根节点将 inorder 分成左子树和右子树 左子树 inorder [9]右子树 inorder [15,20,7]这时候3是根节点 3的左子树…

C++信息学奥赛1178:成绩排序

#include<bits/stdc.h> using namespace std; int main(){int n;cin>>n; // 输入整数 n&#xff0c;表示数组的大小int arr[n]; // 创建大小为 n 的整型数组 arrstring brr[n]; // 创建大小为 n 的字符串数组 brrfor(int i0;i<n;i) cin>>brr[i]>>ar…

数据库设计的六个基本步骤

按照规范设计的方法&#xff0c;考虑数据库及其应用系统开发全过程&#xff0c;可将数据库设计分为以下6个阶段&#xff0c;分别为&#xff1a; 1.需求分析&#xff0c; 2.概念结构设计&#xff0c; 3.逻辑结构设计&#xff0c; 4.物理结构设计&#xff0c; 5.数据库实施&…

Ceph IO流程及数据分布

1. Ceph IO流程及数据分布 1.1 正常IO流程图 步骤&#xff1a; client 创建cluster handler。client 读取配置文件。client 连接上monitor&#xff0c;获取集群map信息。client 读写io 根据crshmap 算法请求对应的主osd数据节点。主osd数据节点同时写入另外两个副本节点数据。…

MES在人工智能方面的应用

MES&#xff08;制造执行系统&#xff09;在人工智能方面的应用主要集中在优化制造流程、提高生产效率和质量控制等方面。以下是一些MES在人工智能领域的应用案例&#xff1a; 1. 预测性维护&#xff1a;通过收集和分析生产设备的传感器数据&#xff0c;结合机器学习算法&am…

Tauri打包windows应用配置中文界面

使用 Tauri Rust 开发桌面应用&#xff0c;在 windows 系统上&#xff0c;打包后安装包名称后缀、安装界面、相关说明默认都是英文的。如果要默认显示为中文&#xff0c;则需要在 tauri.conf.json 中配置相应参数。 前言 默认情况下&#xff0c;在 windows 系统打完的 mis 包…

苹果照片丢失了?三招教你快速找回珍贵照片

照片记录了我们生活中的无数美好瞬间&#xff0c;能够帮助人们重新唤起那些珍贵的记忆。平时&#xff0c;大家也喜欢通过分享照片来让家人和朋友更加了解自己的生活。 如果手机上的照片不小心误删或者莫名丢失&#xff0c;请不必过度焦虑。小编为大家整理了适合果粉恢复苹果照…

中途接手项目,项目经理何如顺利交付?

有一个新项目&#xff0c;因为项目不被公司领导看中&#xff0c;项目金额小&#xff0c;对公司没有多少价值&#xff0c;且客户要求较多&#xff0c;但是碍于客户是熟人又不得不做&#xff0c;原来的项目经理承受不住压力离职&#xff0c;公司打算将这个项目交付这个我&#xf…

Doris行权限入门实战

Doris行权限原理 Doris支持了行级数据权限&#xff0c;当多租户模式使用的是共享表模式的情况下该功能能很方便的帮用户数实现行级权限控制。 Doris的行级权限是通过安全策略(ROW POLICY)实现的。 具体做法为&#xff1a;用户在指定表上创建安全策略并授权到具体的用户&#…

word 插入 高亮代码

word 插入高亮代码&#xff1a; 方法1&#xff1a;直接复制 IDE 中的内容&#xff08;优&#xff1a;随时随地复制&#xff0c;保留vscode格式。缺&#xff1a;其他IDE的格式可能就不好看了&#xff09;方法2&#xff1a;代码复制到网站 highlightcode.com&#xff0c;高亮后再…

函数返回多个值的应用

还是通过一个编程的例子来介绍函数返回多个值的应用。 举例&#xff1a;编写一个C 函数&#xff0c;该函数在一个字符串中找到可能的最长的子字符串并打印出来&#xff0c;该字符串是由同一字符组成的。 分析&#xff1a;这个字符串是存放在字符数组里的&#xff0c;要打印出来…