简介
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的方式创建对象,而是用的反射的方式创建的对象
如何使用返回创建的对象?
- 首先会加载bean.xml配置文件
- 对xml配置文件进行解析操作
- 获取xml文件bean标签属性值、id属性值和class属性值
- 使用反射根据类全路径创建对象
代码演示
@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("日志写入成功!");
}