2下载Spring,第一个Spring程序+Log4j

https://www.yuque.com/dujubin/ltckqu/kipzgd#,注意的是,现在(202401)SpringFramework从release搬到了snapshot下,在这下面找到6.0.2下载.

下载后解压到文件夹,整个框架包含非常多jar包。

然后就可以在pom文件中写入依赖,声明需要的用的jar包。

如果只需要最基本IoC、DI支持,则只需要context包,而context包依赖于其他包,如果采用maven,只要导入context一条依赖即可。


新建一个module,spring6-002,选好SDK版本,maven构建。

老规矩,pom文件入手
1.打包方式选择jar(学习spring不必是web项目,故jar打包即可)
2.添加6.0的spring-context依赖,添加后检查右侧maven目录,会发现自动导入了aop,core,bean等下级依赖.

<packaging>jar</packaging>

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

在这里插入图片描述引入单元测试junit依赖…每次引入的依赖.如果之前已经引用过远程仓库,则已经下载到了本地仓库,此时自己打就会有提示,否则就要从远程仓库查询

   <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.2</version>
        <scope>test</scope>
    </dependency>

3.与mybatis一致,spring也需要在类的根目录路径下(resources)写一个配置文件,创建方式如下.起名为spring.xml在这里插入图片描述4.编写代码,结构如下图

在这里插入图片描述

src\main\java\com\sunsplanter\spring6\dao\UserDaoImplForMySQL
package com.sunsplanter.spring6.dao;
//快速测试第一个程序,就不写接口了
public class UserDaoImplForMySQL {
}
src\main\resources\spring.xml
<?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">

<!--    每个bean标签管理一个对象
        id是唯一的,与mybatis的配置文件非常相似
        class属性声明要管理哪个类中的对象,路径必须完整包含包名-->
<!--    注意,bean标签不是成对的<bean></bean>-->
       <bean id="userDaoBean" class="com.sunsplanter.spring6.dao.UserDaoImplForMySQL"/>
</beans>
src/test/java/com/sunsplanter/spring6/test/FirstSpringTest.java
package com.sunsplanter.spring6.test;

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

public class FirstSpringTest {
    @Test
    public void testFirstTest(){
        //1.与mybatis思想也很相似,写好了容器的配置规格和管理对象(spring.xml),下一步就是想办法制造(获取)出一个容器,用这个容器创建和管理对象
        //ClassPathXmlApplicationContext的参数为spring配置文件的地址
        //applicationContext就是一个spring容器的对象实例,ApplicationContext是一个接口,其有很多实现类,ClassPathXmlApplicationContext就是其中之一
//        ClassPathXmlApplicationContext专门从类的跟路径中加载spring配置文件,因此配置文件只要放在resources下就可以不写全路径
//        默认情况下Spring会通过反射机制,调用类的无参构造方法实例化对象,执行完new读取了配置文件后,对象就已经创建完成
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");

//      2.上句代码执行完成后对象已经创建存在了,getBean是根据bean的id,从spring容器获取要控制的对象
        Object userBean = applicationContext.getBean("userDaoBean");
        System.out.println(userBean);

    }
}

执行test方法,可以正确输出spring帮忙创建并管理的对象(bean).

几个问题
1.Spring创建好的对象如何存储?
在这里插入图片描述
2.Spring配置文件的名字是任意的.
3.Spring配置文件的数量的任意的,只要名字不重复即可,最终都可通过

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");

选择加载的配置文件.

4.配置文件中的类并不一定要自定义类,即使是JDK中的类也可以,只要确保有无参构造方法即可.

测试3和4
resources下新建一个Spring配置文件,命名为Date.xml

   <bean id="dateBean" class="java.util.Date"/>
src/test/java/com/sunsplanter/spring6/test/FirstSpringTest.java
package com.sunsplanter.spring6.test;

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

public class FirstSpringTest {
    @Test
    public void testFirstTest() {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");

        Object dateBean = applicationContext.getBean("dateBean");
        System.out.println(dateBean);

    }
}

此时因为是直接调用Spring创建一个JDK自身的类,因此在src/main/java/com/sunsplanter/spring6目录下,无需声明一个实体类.直接运testFirstTest即可.可以得到输出:
在这里插入图片描述
**5.一个现实以及很重要的问题:**对于上例中的,假如增加了一个方法(事实上实现类肯定有各种各样的方法)

src\main\java\com\sunsplanter\spring6\dao\UserDaoImplForMySQL
package com.sunsplanter.spring6.dao;
//快速测试第一个程序,就不写接口了
public class UserDaoImplForMySQL {
    public void insert(){
        System.out.println(1);
    }
}

再看:原本有一个类(不写接口,简单程序),且原本要在上层类中new出下层类的实例

//这是表现层中实现类中的代码,可以看出,表现层调用了控制层的类去new出对象,返回了具体类型的对象,既 人 张三 = new 人
private Userservice userService = new UserServiceImp();
//既然返回的是举行类型的对象,就可以调用该抽象类中定义的方法
userservice.insert();

但为了OCP,IoC,DIP等原则,new出实例对象全部交给了Spring容器,然而,以上章为例

//然而若用了Spring,通过获取配置文件制造一个容器(applicationContext)-通过容器调用getBean获取一个Object类型的UserDaoImplForMySQL对象
//该对象名为userBean.此时,由于该对象是Object类型的,它无法自己对应抽象类的方法
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
        Object userBean = applicationContext.getBean("userDaoBean");
        userBean.insert();//错误
 //将getBean方法多设置一个参数,指明返回具体类型的对象
        	        UserDaoImplForMySQL userDaoImplForMySQL = applicationContext.getBean("userDaoBean", UserDaoImplForMySQL.class);
        userDaoImplForMySQL.insert();//执行成功

启用Log4j2日志(Spring集成了Log4j2)
第一步:引入Log4j2的依赖

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

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

<?xml version="1.0" encoding="UTF-8"?>

<configuration>

    <loggers>
        <!--
            level指定日志级别,从低到高的优先级:
                ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
        -->
        <root level="DEBUG">
            <appender-ref ref="spring6log"/>
        </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>
    </appenders>

</configuration>

第三步:使用日志框架

src/test/java/com/sunsplanter/spring6/test/FirstSpringTest.java
    Logger logger = LoggerFactory.getLogger(FirstSpringTest.class);
    logger.info("我是一条日志消息");
    logger.debug("de");
    logger.error("er");

注意的是,JDK本身提供了Logger类,使用时一定要先添加依赖-更新maven-手打选择org.slf4j的定义的Logger,直接复制会爆红.
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UMLChina书籍大全(2024)软件方法人月神话人件企业应用架构模式UML参考手册彩色UML建模领域驱动设计对象设计……

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 以下列出有UMLChina标记的书。 首先是写了十几年还没有写完的软件方法 其他的是译作&#xff1a; 人月神话 2002年&#xff0c;UMLChina和清华大学出版社合作&#xff0c;翻译了《人…

linux性能优化

文章目录 性能优化图CPU进程和cpu原理性能指标 性能优化图 CPU 进程和cpu原理 进程与线程&#xff1a; 进程是程序的执行实例&#xff0c;有自己的地址空间和系统资源。线程是进程内的执行单元&#xff0c;共享进程的资源。在多核系统中&#xff0c;使用多线程可以更好地利用多…

倒排索引

正向索引&#xff1a;id&#xff08;序号&#xff09;--》 内容&#xff08;文档或记录&#xff09;--》关键词 &#xff0c;这个过程。 倒排索引&#xff1a;关键词 --》id&#xff08;序号&#xff09;--》内容&#xff0c;这个过程。 在有些图书的最后也有倒排索引的例子 …

Elasticsearch 中映射参数doc_values 和 fielddata分析比较

一、doc_values 默认情况下&#xff0c;大部分字段是索引的&#xff0c;这样让这些字段可被搜索。倒排索引&#xff08;inverted index&#xff09;允许查询请求在词项列表中查找搜索项&#xff08;search term&#xff09;&#xff0c;并立即获得包含该词项的文档列表。 倒排…

适口性好的猫粮:性价比高的主食冻干测评推荐

冻干猫粮因其高营养和适口性&#xff0c;受到了众多铲屎官们的喜爱和追捧。冻干猫粮的喂养方式非常简单&#xff0c;可以直接喂食&#xff0c;也可以将冻干复水后喂食&#xff0c;根据猫咪的不同喜好可以选择不同的喂养方式。然而&#xff0c;有些铲屎官在选择冻干猫粮时会担心…

反距离加权水平内插,附matlab代码(ERA5和GNSS站点不并址的处理方法之水平补偿)

1.内插方法 我在学习过程&#xff0c;内插方法为反距离加权水平内插&#xff0c;分享我的方法和公式&#xff0c;以及matlab代码。 2.使用该内插法的原因 GNSS与ERA5格网位置不并址&#xff0c;需要进行水平方向和垂直方向的补偿的补偿获得。水平方向不并址如第3节图所示&am…

羊大师讲解,羊奶为什么更适合高血压人群?

羊大师讲解&#xff0c;羊奶为什么更适合高血压人群&#xff1f; 高血压是一种常见的健康问题&#xff0c;它会引起诸多并发症并增加心脑血管疾病的风险。与此同时&#xff0c;人们越来越关注饮食对健康的影响。作为一种营养丰富且适合高血压人群的饮品&#xff0c;羊奶备受关…

如何使用 Python+selenium 进行 web 自动化测试?

Selenium是一个自动化测试工具&#xff0c;它可以模拟用户在浏览器中的操作&#xff0c;比如点击、输入、选择等等。它支持多种浏览器&#xff0c;包括Chrome、Firefox、Safari等等&#xff0c;并且可以在多个平台上运行。 安装和配置Selenium 在使用Selenium之前&#xff0c;…

error:0308010C:digital envelope routines::unsupported 前端项目错误

直接启动命令中增加&#xff1a; SET NODE_OPTIONS--openssl-legacy-provider && vue-cli-service serve

WebGIS开发的常见框架及优缺点

WebGIS开发引擎的发展历程&#xff1a; 内容来自公众号&#xff1a;Spatial Data 地图API分类 WebGIS系统通常都围绕地图进行内容表达&#xff0c;但并不是有地图就一定是WebGIS&#xff0c;所以下面要讨论下基于Web的地图API分类及应用场景。Web上的Map API主要分类&#xff…

不要盲目自学网络安全!学习顺序特别重要!

前言 一、什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防…

【QT 5 +Linux下+录屏软件使用+总结说明+使用录屏软件+简单软件使用+SimpleScreenRecorder+操作说明】

【【QT 5 Linux下录屏使用录屏软件简单软件使用SimpleScreenRecorder操作说明】】 1、前言2、实验环境3、录屏软件综述SimpleScreenRecorder&#xff1a;Kazam&#xff1a;OBS Studio (Open Broadcaster Software)&#xff1a;VokoscreenNG&#xff1a;RecordMyDesktop&#xf…

Jmeter如何添加插件

一、前言 ​ 在我们的工作中&#xff0c;我们可以利用一些插件来帮助我们更好的进行性能测试。今天我们来介绍下Jmeter怎么添加插件&#xff1f; 二、插件管理器 ​ 首先我们需要下载插件管理器jar包 下载地址&#xff1a;Install :: JMeter-Plugins.org 然后我们将下载下来…

【unity小技巧】Unity音乐和音效管理器

最终效果 前言 在游戏开发中&#xff0c;音乐和音效的管理是一个重要的环节。好的音乐和合适的音效可以为游戏增添氛围并提升玩家的体验。为了更好地管理音乐和音效&#xff0c;我们可以使用一个专门的音乐和音效管理器。 在本文中&#xff0c;我将向大家介绍如何在Unity中创…

Android 文字垂直排列,文字向右旋转90度

public class VerticalTextView extends View {private final int ROTATION_ANGLE 90; // 旋转角度&#xff0c;用于将文本垂直排列private String text; // 要显示的文本private TextPaint textPaint; // 用于绘制文本的画笔private Rect textBounds;// 文本边界float x, y;/…

Spring Boot 3 集成 Thymeleaf

在现代的Web开发中&#xff0c;构建灵活、动态的用户界面是至关重要的。Spring Boot和Thymeleaf的结合为开发者提供了一种简单而强大的方式来创建动态的Web应用。本文将介绍如何在Spring Boot项目中集成Thymeleaf&#xff0c;并展示一些基本的使用方法。 什么是Thymeleaf&#…

spug发布问题汇总记录

问题导览 1. [vite]: Rollup failed to resolve import "element-plus" from "src/main.js". 项目框架简介 vue3viteelement-plus 解决方案 - 1. 配置淘宝镜像源&#xff1a;npm config set registry https://registry.npm.taobao.org/ - 2. npm inst…

Spring框架-入门(IOC,DI)

文章目录 Spring框架简介创建Spring项目理解IOC和DI&#xff1a;IOC控制反转示例pom.xmlPerson.javaapplicationContext.xmlPersonTest.java DI依赖注入传统的方式GreetingService.javaGreetingServiceImpl.javaGreetingTest.java 使用DI依赖注入GreetingService.javaGreetingS…

Windows平台的网速监控悬浮窗软件Traffic Monitor使用体验

Windows平台的网速监控悬浮窗软件Traffic Monitor使用体验 一、Traffic Monitor介绍1.1 Traffic Monitor简介1.2 Traffic Monitor版本介绍1.3 Traffic Monitor特点 二、下载及安装Traffic Monitor2.1 下载Traffic Monitor2.2 安装Traffic Monitor 三、Traffic Monitor的使用体验…

VSCode上远程调试代码出现的问题

记录一下&#xff1a; 真的是汗流浃背了&#xff0c;师妹叫帮忙如何在VSCode上远程调试代码&#xff0c;一些自己已经经历过的问题&#xff0c;现在已经忘记了。又在网上一顿搜索&#xff0c;这次记录下吧。。。 出现以下问题&#xff1a; 1. 终端界面总是sh-4.4 $ &#xff…