赞
踩
自2022年11月,Spring6正式发布。在Spring6中,对于JDK的要求最低为 17+。(17 - 19)
部分文本摘抄于尚硅谷视频(bilibili)做了一定的排版和个人的理解。如果不是很熟悉,可以去看
Spring5全面详解 内容大约十万字左右, 对于Spring5的使用整理的较为全面,也都有解释部分,Spring6只是看以下是否具有一些特性上的更换。所以可能并没有Spring5的内容详细。但本篇大约在8-10万字左右。持续进行编写。
在spring6中,Core的核心模块有以下内容
SpringCore提供了IOC,DI,Bean配置装载创建的核心实现。核心概念:Beans,BeanFactory,BeanDefinitons,ApplicationContext。
<dependencies> <!-- 引入spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>6.0.3</version> </dependency> <!-- 引入Junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency> <!-- 引入LomBok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.26</version> </dependency> </dependencies>
新建一个包,里面包含一个User实体类。 pojo -> User.java。然后User内含有以下代码。
package org.example.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.ToString; @AllArgsConstructor @NoArgsConstructor @Data @ToString public class User { private String username; private String password; private Integer age; private String phoneNumber; }
然后去创建对应的Spring配置文件。可以在Idea中快捷去创建对应的配置文件。右键resources的包,然后new —>
XML Configuration File。即可。创建完成后, 使Spring对我们的User类进行托管。
<?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">
<bean id="user" class="org.example.pojo.User">
<property name="username" value="张三" />
<property name="password" value="123456" />
<property name="age" value="18" />
<property name="phoneNumber" value="12368965432" />
</bean>
</beans>
在完成上述步骤后,在一个具有Main方法的类中,去进行测试。
package org.example; import org.example.pojo.User; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main { public static void main(String[] args) { // 通过Xml加载获取Ioc容器对象。 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); // 通过Ioc容器获取Bean对象 User user = applicationContext.getBean("user", User.class); // 打印对象内容,查看内容是否对的上。[User(username=张三, password=123456, age=18, phoneNumber=12368965432)] System.out.println(user); } }
Class<?> aClass = Class.forName("org.example.pojo.User");
User userClass = (User) aClass.getDeclaredConstructor().newInstance();
会放在一个Map集合里,该属性存在于 DefaultListableBeanFactory 类中。属性名称为:
private final Map<String, BeanDefinition> beanDefinitionMap;
在该Map<String, BeanDefinition> 中。
日志日志的优先级从高到低有 TRACE < DEBUG < INFO < WARN < ERROR < FATAL
上面这些内容主要用于指定程序日志的重要程度,优先级高的日志信息会覆盖掉优先级低的日志信息,如果你在程序中使用一条INFO级别的日志信息,则DEBUG和TRACE不会显示。
一般来说指的是,把日志输出到控制台,或者把日志输出到文件内进行本地存储。
就是决定了你输出日志的时候,日志以什么样的形式进行输出。
<!-- 引入log4j2 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.20.0</version>
</dependency>
<!-- 引入log4j2的实现,slf4j2-impl -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j2-impl</artifactId>
<version>2.20.0</version>
</dependency>
首先固定名称为: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属性决定,适合临时测试用--> <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>
在配置完成后,他是自动实现的。你在重新去执行Main方法的时候,就会看到对应的日志信息。同时目录下还会生成两个.log文件。
2023-03-02 10:41:18 889 [main] DEBUG org.springframework.context.support.ClassPathXmlApplicationContext - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@2b72cb8a
2023-03-02 10:41:18 997 [main] DEBUG org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loaded 1 bean definitions from class path resource [applicationContext.xml]
2023-03-02 10:41:19 024 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'user'
User(username=张三, password=123456, age=18, phoneNumber=12368965432)
我们可以在我们的代码中,加入Log日志的使用。需要我们定义一个成员变量。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private final Logger logger = LoggerFactory.getLogger(Main.class);
完整代码
package org.example; import org.example.pojo.User; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main { private static final Logger logger = LoggerFactory.getLogger(Main.class); public static void main(String[] args) throws Exception { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); User user = applicationContext.getBean("user", User.class); System.out.println(user); logger.info("我们执行了Main方法"); } }
得到的日志结果为:
2023-03-02 10:46:07 133 [main] DEBUG org.springframework.context.support.ClassPathXmlApplicationContext - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@490caf5f
2023-03-02 10:46:07 209 [main] DEBUG org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loaded 1 bean definitions from class path resource [applicationContext.xml]
2023-03-02 10:46:07 225 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'user'
User(username=张三, password=123456, age=18, phoneNumber=12368965432)
2023-03-02 10:46:07 263 [main] INFO org.example.Main - 我们执行了Main方法
在方法内,不止可以使用info方法,其他级别的都可以使用,有DEBUG,有ERROR等各种级别的方法供来调用。
IOC是 Inversion of Control 的简写,译为 “控制反转”,他不是一门技术,而是一种设计思想,是一个重要的面向对象编程法则,能够指导我们设计出低耦合,优良的程序。
Spring通过Ioc来控制对象之间的创建和初始化,控制对象与对象之间的依赖关系,我们从IOC容器中获取到的Java对象称为Spring Bean对象。它与使用 new 关键字创建的Java对象没有任何区别。
DI(Dependency Injection) 依赖注入实现控制反转。
常见的DI注入方式主要是以下两种:
Spring 的Ioc 容器就是IOC思想的一个落地实现。IOC内管理的内容组件称为Bean,在创建Bean之前,需要先创建IOC容器。对于IOC容器的实现,Spring提供了两种实现方式。
该接口是针对于IOC的基本实现,但是该接口不面向开发人员,用于Spring内部开发使用。
BeanFactory的子接口,拥有比BeanFactory更多的特性,做了很多增强,面向开发人员,在绝大部分场景下,我们选择使用ApplicationContext,而不是使用底层的BeanFactory。
// 获取Class对象的多种方式 @Test public void test01() throws ClassNotFoundException { // 第一种方式 通过对象 .class Class<User> userClass = User.class; // 第二种方式 通过forName来获取class对象 Class<?> aClass = Class.forName("org.example.pojo.User"); // 第三种方式,通过new对象来获取class Class<? extends User> aClass1 = new User().getClass(); // 通过反射创建对象 User user = userClass.getDeclaredConstructor().newInstance(); System.out.println(user); }
有两种获取全部构造器的方式,分别是
代码示例
// 通过反射获取构造方法。 @Test public void test02() throws Exception { Class<User> userClass = User.class; // 第一种获取方式(针对public修饰过的构造方法) Constructor<?>[] constructors = userClass.getConstructors(); for (Constructor<?> constructor : constructors) { System.out.println("构造器名称: " + constructor.getName() + "\n参数个数: " + constructor.getParameterCount()); } // 第二种获取方式(可以获取到private修饰的构造方法) Constructor<?>[] declaredConstructors = userClass.getDeclaredConstructors(); for (Constructor<?> declaredConstructor : declaredConstructors) { System.out.println("构造器名称: " + declaredConstructor.getName() + "\n参数个数: " + declaredConstructor.getParameterCount()); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。