Spring入门

97 阅读7分钟

- Spring是什么

  • 一款主流的JAVA EE 轻量级开源框架
  • Spring的划分方式 狭义的Spring:Spring Framework,通常将其称为Spring框架
  • 两个核心模块:IOC、AOP
  • IOC是什么:[控制反转]即把创建对象的过程交给Spring进行管理
  • AOP是什么:[面向切面编程]封装多个类的公共行为,将与业务无关,却为业务模块所共同调用的逻辑封装起来,减少系统重复的代码,降低模块间的耦合度,另外,AOP好解决一些系统层面上的问题,如日志,事务,权限等
  • SpringFramework的特点
  • 非侵入式:使用该框架时,对应用程序本身的结构影响很小;对功能性组件只需要使用几个简单的注解进行标记,完全不会破坏原有结构,还能将组件结构进一步简化
  • 控制反转:反转资源获取方向,把自己创建资源、向环境索取资源 变成 环境把资源准备好,我们享受资 源注入
  • 面向切面编程:在不修改源代码的基础上增加代码功能
  • 容器:Spring IOC 是一个容器,包含并且管理组件对象的生命周期。组件享受了容器化管理,PG屏蔽了组件过程中的大量细节,极大地降低了使用门槛。
  • 组件化:把复杂应用拆分成多个简单组件,然后Spring 实现了将它们组合成一个复杂的应用。在Spring中可以使用XML和java注解组合这些对象
  • 一站式:在IOC和AOP的基础上可以整合各种企业应用的开源框架和优秀的第三方类库。 -Spring的模块组成和版本要求 -** Spring Core**
  • Spring AOP
  • Spring Data Access
  • Spring Web
  • Spring Message
  • Spring test
  • Spring 6的特点
  • jdk 17
  • Spring 6.0.2
  • IDEA:2022.1.2
  • 入门 -环境要求
  • jdk17、Maven:3.6+,Spring:6.0.2

- maven:

  • bin:存放了 maven 的命令

  • boot:存放了一些 maven 本身的引导程序,如类加载器等

  • conf:存放了 maven 的一些配置文件,如 setting.xml 文件

  • lib:存放了 maven 本身运行所需的一些 jar 包

  • maven的仓库:

  • Maven的仓库分类

  • 本地仓库: 位于自己计算机中的仓库, 用来存储从远程仓库或中央仓库下载的插件和 jar 包

  • 远程仓库: 需要联网才可以使用的仓库,阿里提供了一个免费的maven 远程仓库。

  • 中央仓库: 在 maven 软件中内置一个远程仓库地址 repo1.maven.org/maven2 ,它是中央仓库,服务于整个互联网,它是由 Maven 团队自己维护,里面存储了非常全的 jar 包,它包含了世界上大部分流行的开源项目构件

  • maven仓库默认是在 C盘 .m2 目录下,不要将仓库放在C盘【D:\mvnrepository】

  • 在IDEA中配置maven

  • image.png

  • 报错1:

  • 解决IDEA导入maven项目Plugin ‘org.apache.maven.plugins:maven-compiler-plugin:‘ not found问题_plugin 'org.apache.maven.plugins:maven-war-plugin:-CSDN博客

  • 报错2:

  • IDEA 没有spring config ,4层解决方法_idea 右键没有spring config-CSDN博客

  • 入门案例-步骤

  • 创建 maven 聚合工程

  • 父工程 spring6 -子模块 spring-first

  • (1)引入spring相关依赖

  • (2)创建类,定义属性和方法

  • (3)按照spring 要求创建配置文件(xml格式)

  • (4)在spring配置文件中配置相关信息

  • (5)测试

  • 案例说明:

  • (1)创建对象,无参构造会执行

  • (2)不使用new方式,使用反射机制实现的:

  • 如何使用反射创建的对象?

  • 2.1 加载bean.xml 配置文件

  • 2.2 对xml文件进行解析操作

  • 2.3 获取xml文件bean标签属性值:id属性值和class属性值

  • 2.4 利用反射,根据类的全路径创建对象

  • Class clazz = Class.forName(class属性值);

  • (3)创建好的对象放到哪里?

  • 创建好的对象放在Map集合中

  • Map<String,BeanDefinition>

  • key:唯一标识

  • value:描述信息

  • 2.5 启用Log4j2日志框架

  • 运行情况、错误信息

  • Apache Log4j2:开源日志记录组件 -重要组件构成 -(1)日志信息的优先级【低->高】:

  • TRACE:追踪

  • DEBUG:调试

  • INFO:信息,输出重要信息

  • WARN:警告,输出警告信息

  • ERROR:错误,输出错误信息

  • FATAL:严重错误 -级别高的会自动屏蔽级别低的日志 -(2)日志信息的输出目的地

  • 指定了日志将打印到 控制台 还是 文件中 -(3)日志信息的输出格式

  • 控制了日志信息的显示内容

  • 引入Log4j2依赖

  • 加入日志配置文件

  • 测试-使用日志

  • 报错:在引入log4j2依赖时报错: image.png

  • 处理方式:

image.png

  • 加入配置文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <loggers>
        <!--
             level指定日志级别,从低到高的优先级:
             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="d:/spring6_log/test.log" append = "false">
            <PatternLayout pattern = "%d{yyyy-MM-dd HH:mm:ss SSS}
              [%t] %-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" />
           <SizeBaseTriggeringPolicy size = "50MB"/>
<!--        DefaultRolloverStrategy属性 如不设置
            则默认最多同一个文件夹下7个文件,这里设置了20-->
            <DefalutRolloverStrategy max = "20"/>
        </RollingFile>

    </appenders>

</configuration>
  • 该日志是启动运行时日志,也可以手动向控制台写入日志
import com.lhm.spring6.User;
//手动日志所需要的包
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

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

import java.lang.reflect.InvocationTargetException;

public class TestUser {
    // 手动日志-创建log对象
    private  Logger logger = LogManager.getLogger(TestUser.class);

    @Test
    public void testUserObject() {
        // 加载spring配置文件,对象创建
        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
        // 获取创建的对象
        User user = (User) context.getBean("user");
        System.out.println(user);
        // 使用对象调用方法进行测试
        user.add();

        // 手动写日志
        logger.info("执行调用成功..");
    }

    // 反射创建对象
    @Test
    public void testUserObject01() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        // 获取类Class对象
        Class<?> clazz = Class.forName("com.lhm.spring6.User");
        // 调用方法创建对象
        User user = (User) clazz.getDeclaredConstructor().newInstance();
        System.out.println(user);
    }
}
  • 导入的包还有第二种选择:

  • 比如:org.slf4j.LoggerFactory

  • 它们区别如下:

  • Log4j2 是一个具体的日志框架,提供了自己的日志记录器管理类 LogManager 和日志记录器接口 Logger

  • SLF4J 是一个抽象层,通过 LoggerFactory 提供了一种方式来获取日志记录器,这个日志记录器可以基于不同的具体日志框架进行切换和配置

  • 如果已经确定使用 Log4j2 作为日志框架,那么应该使用 org.apache.logging.log4j.LogManagerorg.apache.logging.log4j.Logger 来配置和记录日志。而如果你的应用中可能会使用不同的日志实现,你可以考虑使用 SLF4J 提供的抽象层,然后通过 LoggerFactory 获取日志记录器,在代码中更容易切换不同的日志框架。

  • IoC容器

  • Inversion of cxontrol

  • **Spring 通过 IoC容器 来 管理所有Java对象的实例化和初始化、控制对象与对象之间的依赖关系。

  • **将由IoC容器管理的Java对象称为Spring Bean,它与使用关键字new创建的Java对象没有任何区别。

  • IoC是Spring重要的核心组件之一。

    1. 控制反转
  • 控制反转是什么?

  • -控制反转不是一门技术,而是一种设计思想。为了降低耦合度,提高程序扩展能力。

  • 控制反转,反转的是什么?

    • 将对象的创建权利交出去,交给第三方容器负责
    • 将对象与对象之间的关系的维护全交出去,交给第三方容器负责
  • 控制反转的思想如何实现?

    • DI(Dependency Injection):依赖注入
  • 容器中放的是bean对象,使用map集合(key-value)

  • 2.依赖注入

  • 依赖注入是什么?

    • Spring创建对象的过程中,将对象依赖属性通过配置进行注入
  • 依赖注入的常见实现方式:

    • 第一种:set注入
    • 第二种:构造注入