Spring介绍和Log4j2

news2024/12/23 18:13:29

目录

  • 一、模块组成
  • 二、基本用例-Spring框架基本使用、
  • 原理
  • 三、启用日志框架

Spring 有两个最核心模块: IoC 和 AOP。

  • IoC:Inverse of Control 的简写,译为“控制反转”,指把创建对象过程交给 Spring 进行管理
  • AOP:Aspect Oriented Programming 的简写,译为“面向切面编程”。AOP 用来封装多个类的公共行为,将那些与业务无关,却为业务模块所共同调用的逻辑封装起来,减少系统的重复代码,降低模块间的耦合度。另外,AOP 还解决一些系统层面上的问题,比如日志、事务、权限等。

一、模块组成

在这里插入图片描述

  • Spring Core(核心容器)
    ​ spring core提供了IOC,DI,Bean配置装载创建的核心实现。核心概念: Beans、BeanFactory、BeanDefinitions、ApplicationContext。

    • spring-core :IOC和DI的基本实现

    • spring-beans:BeanFactory和Bean的装配管理(BeanFactory)

    • spring-context:Spring context上下文,即IOC容器(AppliactionContext)

    • spring-expression:spring表达式语言

  • Spring AOP(面向切面编程)

    • spring-aop:面向切面编程的应用模块,整合ASM,CGLib,JDK Proxy
    • spring-aspects:集成AspectJ,AOP应用框架
    • spring-instrument:动态Class Loading模块
  • Spring Data Access(数据访问)

    • spring-jdbc:spring对JDBC的封装,用于简化jdbc操作
    • spring-orm:java对象与数据库数据的映射框架
    • spring-oxm:对象与xml文件的映射框架
    • spring-jms: Spring对Java Message Service(java消息服务)的封装,用于服务之间相互通信
    • spring-tx:spring jdbc事务管理
  • Spring Web(应用程序)

    • spring-web:最基础的web支持,建立于spring-context之上,通过servlet或listener来初始化IOC容器
    • spring-webmvc:实现web mvc
    • spring-websocket:与前端的全双工通信协议
    • spring-webflux:Spring 5.0提供的,用于取代传统java servlet,非阻塞式Reactive Web框架,异步,非阻塞,事件驱动的服务
  • Spring Message(消息传递)

    • Spring-messaging:spring 4.0提供的,为Spring集成一些基础的报文传送服务
  • Spring test(测试)

    • spring-test:集成测试支持,主要是对junit的封装

二、基本用例-Spring框架基本使用、

说明:

本基本用例演示,通过XML方式,实现Bean的自动注入

步骤一:构建模块

  • 通过Idea开发工具,创建空项目后创建子模块
    在这里插入图片描述

步骤二:导入依赖

  • 修改模块的pom.xml文件
<dependencies>
    <!--spring context依赖-->
    <!--当你引入Spring Context依赖之后,表示将Spring的基础依赖引入了-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>6.0.2</version>
    </dependency>

    <!--junit5测试-->
    <!--此依赖可选,主要便于junit进行测试使用-->
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>5.3.1</version>
    </dependency>
</dependencies>

步骤三:创建实体

package org.example.entity;

public class User {
    public void add() {
        System.out.println("add……");
    }
}


步骤四:创建配置文件

  • 在模块的resources目录下,创建beans.xml文件

创建beans.xml文件,是为了完成通过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">

    <!--id是该bean的唯一标识符,在整个应用程序上下文中用于获取该bean实例-->
    <!--class是该bean所属的Java类的全限定名(包括包名),它告诉Spring需要实例化哪个类-->
    <bean id="user" class="org.example.entity.User"/>
</beans>

说明:

  • 在beans,xml文件中,有bean标签
  • 在beans,xml文件中,bean标签有Id属性,与class属性

步骤五:演示

  • 在模块中的test.java包下,创建UserTest类

    public class UserTest {
        @Test
        public void testUserObject() {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
        User user = (User) applicationContext.getBean("user");
        user.add(); // add……
    }
    }
    

原理

笔记小结:通过XML方式,实现Bean的自动注入的基本用例原理

  1. 创建对象时,会调用无参构造方法
  2. Spring 是通过反射机制调用无参构造方法创建对象
  3. Spring 创建的对象(Bean对象),最终存储在Spring容器

1.创建对象时,会调用无参构造方法

public class HelloWorld {
    public HelloWorld() {
        System.out.println("无参数构造方法执行");
    }
    public void sayHello(){
        System.out.println("helloworld");
    }
}

在这里插入图片描述
2.Spring 是通过反射机制调用无参构造方法创建对象
在这里插入图片描述

// dom4j解析beans.xml文件,从中获取class属性值,类的全类名
// 通过反射机制调用无参数构造方法创建对象
Class clazz = Class.forName("com.py.spring6.User");
//Object obj = clazz.newInstance();
Object object = clazz.getDeclaredConstructor().newInstance();

3.Spring 创建的对象(Bean对象),最终存储在Spring容器中

private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);

说明:

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

三、启用日志框架

  1. 概述:Log4j2是一个开源的Java日志框架,帮助Java开发人员在应用程序中实现灵活和可配置的日志记录

  2. 组成:

    • 日志信息的优先级:TRACE < DEBUG < INFO < WARN < ERROR < FATAL(级别高的屏蔽级别低的)
    • TRACE:追踪,是最低的日志级别,相当于追踪程序的执行
    • DEBUG:调试,一般在开发中,都将其设置为最低的日志级别
    • INFO:信息,输出重要的信息,使用较多
    • WARN:警告,输出警告的信息
    • ERROR:错误,输出错误信息
    • FATAL:严重错误
    • 日志信息的输出目的地:日志信息的输出目的地指定了日志将打印到控制台还是文件中
    • 日志信息的输出格式:日志信息的显示内容
  3. 基本用例:

    • 导入依赖:
    <!--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>
    
    • 创建日志配置文件:建议复制根据需求修改

      • 在模块文件路径在resource的根路径下,配置文件名为log4j2.xml
        <?xml version="1.0" encoding="UTF-8"?>
        <configuration>
            <loggers>
                <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="d:/spring6_log/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="d:/spring6_log/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>
        
        
    • 使用日志

      • 在日常中,只用log4j2,此处创建TestUser 使用

        public class TestUser {
           // 1.通过日志工程获取日志对象记录器
           private Logger logger = LoggerFactory.getLogger(TestUser.class);
           @Test
           public void testUserObject() {
               ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
               User user = (User) applicationContext.getBean("user");
               user.add(); // add……
               // 2.手动写日志
               logger.info("执行成功");
           }
        }
        
  4. 结果:
    在这里插入图片描述

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

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

相关文章

python爬虫代理ip池搭建

最近大量爬取数据的时候总会遇到被封ip的情况&#xff0c;所有打算自己搭建一个代理ip池来使用。本次使用的是开源的ip代理池项目ProxyPool 1.下载redis数据库 redis安装 这里我选择直接下载redis的解压包形式&#xff0c;方便安装。下载地址&#xff1a;发布 TPORADOWSKI/RED…

Linux网络协议栈的实现

网络协议栈是操作系统核心的一个重要组成部分&#xff0c;负责管理网络通信中的数据包处理。在 Linux 操作系统中&#xff0c;网络协议栈&#xff08;Network Stack&#xff09;负责实现 TCP/IP 协议簇&#xff0c;处理应用程序发起的网络请求并与底层的网络硬件进行交互。本文…

关于ansible自动化运维工具

成长路上不孤单&#x1f60a;【14后&#xff0c;C爱好者&#xff0c;持续分享所学&#xff0c;如有需要欢迎收藏转发&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#xff01;&#xff01;&#xff01;&#xff01;&#xff…

空间工作记忆策略在控制网络和默认模式网络中的激活差异

摘要 空间位置可以通过不同的表征方式和策略在工作记忆中进行编码和维持。精细的表征方式提供了详细的刺激信息&#xff0c;但对认知要求较高&#xff0c;并且容易出现不准确的情况。精细表征中的不确定性可以通过使用粗略但稳健的类别表征来补偿。本研究采用个体差异法来识别…

如何将java文件导入idea中运行和推送到Gitee仓库问题

&#xff08;注意&#xff1a;如果不上传到Gitee平台,就请忽略最后每个方法的最后一步&#xff09; 另外如果导入的是Maven文件&#xff0c;先要指定好自己本地的Maven库的位置和Setting 文件&#xff0c;然后重新加载一下maven即可。 第一种方法 &#xff1a; 1、导入Java文…

C语言——将一个字符串中的元音字母复制到另一个字符串,然后输出。

写一函数&#xff0c;将一个字符串中的元音字母复制到另一个字符串&#xff0c;然后输出。 注意&#xff0c;字符串b必须以\0为结束标志&#xff0c;C 语言中的字符串必须以 \0&#xff08;空字符&#xff09;结束&#xff0c;否则输出函数&#xff08;如 puts&#xff09;无法…

精益生产现场管理和改善的实战路径

精益生产&#xff0c;作为制造业的革新利器&#xff0c;不仅能够帮助企业降低成本、提升质量&#xff0c;还能大幅度提高生产效率。但如何将这一理念从理论转化为实际行动&#xff0c;真正落地于生产现场&#xff0c;成为许多管理者面临的难题。今天&#xff0c;就让天行健咨询…

【前端】探索webpack3项目build速度优化, 优化个p

文章目录 背景uglifyjs-webpack-pluginwebpack3 压缩混淆js 优化踩坑。结论 背景 webpack3 babel7 uglifyjs-webpack-plugin的项目&#xff0c;build起来是什么体验。 大抵是写了两个月后&#xff0c;发现build时间从120s激增到400s。而这400秒中&#xff0c;有50多秒是Ugli…

批量创建文件夹和文件——excel VBA实现

当需要创建大量文件夹及文件时&#xff0c;可借助excel vba 实现&#xff0c;如下图&#xff1a; 批量创建文件名为1-10的文件夹&#xff0c;每个文件夹内有个与文件名相同的txt文件&#xff0c;txt文件内的数字也跟文件名相同。 附代码&#xff1a; Sub CreateFoldersAndFile…

iphone13 不升级IOS使用广电卡

iPhone13的信号&#x1f4f6;&#xff0c;15系统刷高版本iPCC&#xff0c;本帖以后不再更新&#xff01;&#xff01;&#xff01; 自从知道可以通过刷iPCC的方式改善信号(不更新iOS大版本的情况下)&#xff0c;尝试了各种版本。 我自己用下来总结 - 移动联通48、49、50 &…

62.以太网数据回环实验(5)

&#xff08;1&#xff09;UDP顶层模块代码&#xff1a; module udp (input wire gmii_txc ,input wire gmii_rxc ,input wire reset_n ,input wire gmii_rx_dv ,input wi…

使用FastJson2将对象转成JSON字符串时,小数转换出错

maven坐标 <dependency> <groupId>com.alibaba.fastjson2</groupId> <artifactId>fastjson2</artifactId> <version>2.0.40</version> </dependency> 问题现象&#xff1a; 问题原因&#xff1a; IOUtils.write…

RabbitMQ 高级特性——消息确认

文章目录 前言消息确认机制SpringBoot 实现消息确认NONEAUTOMANUAL 前言 前面我们学习了 SpringBoot 整合 RabbitMQ&#xff0c;并且使用 RabbitMQ 实现了几种工作模式&#xff0c;接下来我们将学习关于 RabbitMQ 的高级特性——消息确认机制&#xff0c;持久化和发送方确认。…

99.WEB渗透测试-信息收集-网络空间搜索引擎shodan(1)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;98.WEB渗透测试-信息收集-Google语法&#xff08;12&#xff09; 信息收集方向-网络空间…

探索全球实时云渲染与XR技术的多平台兼容性:谁是行业引领者?

在扩展现实&#xff08;XR&#xff09;技术与实时云渲染技术的飞速发展中&#xff0c;多平台兼容性已经成为行业技术竞争的关键要素。能够在不同的平台和设备上高效运行的解决方案&#xff0c;不仅关系到开发效率和场景多样性&#xff0c;还直接影响到用户体验和市场占有率。Pa…

续航和性能好的随身WiFi怎么选?一篇文章告诉你哪个随身WiFi值得买,格行vs华为vs中兴vs飞猫vs闪鱼

各大购物平台的大促已经开始&#xff0c;还在纠结入手哪个随身WiFi的小伙伴&#xff0c;小编今天用一篇文章告诉你哪款随身WiFi值得买 一、格行&#xff1a;成立于2009年&#xff0c;有15年的行业经验&#xff0c;是随身WiFi、物联网行业的巨头&#xff0c;销量持续保持领先&am…

活用c4d官方开发文档查询代码

当你问AI助手比如豆包&#xff0c;如何用python禁止掉xpresso标签时候&#xff0c;它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

码上进阶_刷题模块测试_用例设计

码上进阶_刷题模块测试_用例设计 系统概述&#xff1a; 码上进阶是为程序员专门打造的交流平台&#xff0c;采用主流的微服务框架和C端技术栈作为技术基础。在这个平台上&#xff0c;程序员 可以通过刷题、练习和模拟面试来提升自己的面试能力。 功能测试&#xff1a; 登录…

机器人领域超重量奖项TRO傅京孙最佳论文奖汇总【上】

更多优质内容&#xff0c;请关注公众号&#xff1a;智驾机器人技术前线 简介 IEEE Transactions on Robotics King-Sun Fu Memorial Best Paper Award这个奖项是为了表彰每年在《IEEE Transactions on Robotics》上发表的最佳论文。 以下是该奖项的一些信息&#xff1a; 奖项…

2025通信硕士找工作纪实

通信算法工程师秋招基本情况 读博难 国内读博难&#xff1a;华五以上&#xff0c;信息与通信工程专业&#xff0c;基本无普博hc&#xff0c;都是直博。偶尔有一些招普博的老师&#xff0c;是许久不科研&#xff0c;或者来了都去做横向。唯一可能的普博机会&#xff0c;是找刚入…