Spring入门简介

简介

2022年11月,Spring6正式版本发布,标志着一个新的时代到来

Spring框架是一款 主流的JavaEE的轻量级开源框架,为了解决企业应用开发的复杂性而出现。Spring框架的用途不仅仅限于服务器端的开发,从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从
Spring中受益。Spring框架凭借其强大的功能和优良的性能,在企业开发中被广泛应用。

学习前需要掌握的知识:

如果还有不太熟悉的可以点击跳转查漏补缺。

Spring狭义是指Spring FrameWork ,其有两个最核心的模块:IoC和AOP。

IoC:Inverse of Control的简写,译为“控制反转”,指把创建对象过程交给Spring进行管理。

AOP:Aspect Oriented Programming的简写,译为“面向切面编程”。AOP用来封装多个类的公共行为,将那些与业务无关,却为业务模块所共同调用的逻辑封装起来,减少系统的重复代码,降低模块间的耦合度。另外,
AOP还解决一些系统层面上的问题,比如日志、事务、权限等。

Spring FrameWork特点

● 非侵入式:使用Spring Framework开发应用程序时,Spring 对应用程序本身的结构影响非常小。对领域模
型可以做到零污染;对功能性组件也只需要使用几个简单的注解进行标记,完全不会破坏原有结构,反而能将
组件结构进一步简化。 这就使得基于Spring Framework开发应用程序时结构清晰、简洁优雅。

● 控制反转: IoC --> Inversion of Control,翻转资源获取方向。把自己创建资源、向环境索取资源变成环境将资源准备好,我们享受资源注入。

● 面向切面编程: AOP --> Aspect Oriented Programming,在不修改源代码的基础上增强代码功能。

● 容器: Spring IoC是一个容器,因为它包含并且管理组件对象的生命周期。组件享受到了容器化的管理,替程序员屏蔽了组件创建过程中的大量细节,极大的降低了使用门槛,大幅度提高了开发效率。

● 组件化: Spring 实现了使用简单的组件配置组合成一个复 杂的应用p在Spring中可以使用XML和Java注解
组合这些对象。这使得我们可以基于一个个功能明确、 边界清晰的组件有条不紊的搭建超大型复杂应用系统。

● 一站式:在lOC和AOP的基础上可以整合各种企业应用的开源框架和优秀的第三方类库。而且Spring旗下的项目已经覆盖了广泛领域,很多方面的功能性需求可以在Spring Framework的基础上全部使用Spring来实现。

入门

Spring6要求最低的jdk为17

首先创建一个Maven的父类仓库,再创建一个子类仓库进行下面的操作

先在子类模块的pom.xml中引入Spring6和junit依赖,代码如下

<dependencies>
<!--        spring context依赖-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>6.0.2</version>
    </dependency>

<!--        junit-->
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter</artifactId>
        <version>5.8.1</version>
        <scope>test</scope>
    </dependency>
</dependencies>

其次在main中的java写入一个简单Person类,实现一个方法

public class User {
    public User () {
		System.out.println("无参构造器...");
	}
	public void speak(String name){
		System.out.println("Hello !" + name);
	}
}

再在main下的resources包下创建一个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">
<!--    完成User对象创建-->
    <bean id="user" class="code.User"></bean>
</beans>

在测试包下创建一个测试类

package TestCode;

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

/**
 * @创建人 HeXin
 * @所属包 UserTest
 * @所属项目 Spring6
 * @创建时间 2023/2/24 20:11
 * @描述 测试类
 */
public class UserTest {
	@Test
	public void test(){
		//加载spring配置文件,创建对象
		ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
		//获取创建的对象
		User user = (User) context.getBean("user");
        System.out.println(user);
		//使用对象调用方法进行测试
		user.speak("World");
	}
}

执行测试,如果没有报错,则说明第一个Spring程序已经运行成功!!!

原理解析

创建对象时使用了无参构造器。没用使用new的方式创建对象,而是用的反射的方式创建的对象

如何使用返回创建的对象?

  1. 首先会加载bean.xml配置文件
  2. 对xml配置文件进行解析操作
  3. 获取xml文件bean标签属性值、id属性值和class属性值
  4. 使用反射根据类全路径创建对象

代码演示

@Test
public void test(){
    User user = null;
    try {
        //获取类Class对象
        Class clazz = Class.forName("code.User");
        //调用方法创建对象
        user = (User) clazz.getDeclaredConstructor().newInstance();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    }
    user.speak(" Spring!");
}

创建好的对象将被放在一个map集合中

Map<String,BeanDefinition> beanDefinitionMap
    key:唯一标识
    value:类的定义(描述信息)

Log4j日志框架

概述

在项目开发中,日志十分的重要,不管是记录运行情况还是定位线上问题,都离不开对日志的分析。日志记录了系统行为的时间、地点、状态等相关信息,能够帮助我们了解并监控系统状态,在发生错误或者接近某种危险状态时能够及时提醒我们处理,同时在系统产生问题时,能够帮助我们快速的定位、诊断并解决问题。

重要组件构成

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

  • TRACE:追踪,是最低的日志级别,相当于追踪程序的执行。
  • DEBUG:调试,一般在开发中,都将其设置为最低的日志级别。
  • INFO:信息,输出重要的信息,使用较多。
  • WARN:警告,输出警告的信息。
  • ERROR:错误,输出错误信息。
  • FATAL:严重错误。

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

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

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

引入Log4j依赖

  <!--log4j的依赖-->
<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指定日志级别,从低到高的优先级:
                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属性决定,适合临时测试用-->
        <!--这里的filename要改成自己创建的目录下(如果没有d盘),否则会报错-->
        <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大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,
            作为存档-->
        <!--这里的filename要改成自己创建的目录下(如果没有d盘),否则会报错-->
        <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>

注意:需将file标签中的地址改为自己存放日志的地址

使用日志(手动写入日志信息)

//导入的包
import code.User;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.lang.reflect.InvocationTargetException;


//创建Logger对象
private Logger logger = LoggerFactory.getLogger(UserTest.class);
@Test
public void testUser(){
    //加载spring配置文件,创建对象
    ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
    //获取创建的对象
    User user = (User) context.getBean("user");
    //使用对象调用方法进行测试
    user.speak("World");

    //手动写日志
    logger.info("日志写入成功!");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值