Spring介绍和Log4j2

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. 结果:
    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值