一、Spring 简介
英文官网:Spring | Home
中文官网:Spring 中文网 官网
下载地址(5.3.9):JFrog
Spring 框架中的 jar 包
spring-core-5.3.9.jar
:字节码(这个是支撑程序运行的jar包)
spring-core-5.3.9-javadoc.jar
:代码中的注释
spring-core-5.3.9-sources.jar
:源码
JAR文件 | 描述 |
---|---|
spring-aop-5.3.9.jar | 这个jar 文件包含在应用中使用Spring 的AOP 特性时所需的类 |
spring-aspects-5.3.9.jar | 提供对AspectJ的支持,以便可以方便的将面向切面的功能集成进IDE中 |
spring-beans-5.3.9.jar | 这个jar 文件是所有应用都要用到的,它包含访问配置文件、创建和管理bean 以及进行Inversion ofControl / Dependency Injection(IoC/DI)操作相关的所有类。如果应用只需基本的IoC/DI 支持,引入spring-core.jar 及spring-beans.jar 文件就可以了。 |
spring-context-5.3.9.jar | 这个jar 文件为Spring 核心提供了大量扩展。可以找到使用Spring ApplicationContext特性时所需的全部类,JDNI 所需的全部类,instrumentation组件以及校验Validation 方面的相关类。 |
spring-context-indexer-5.3.9.jar | 虽然类路径扫描非常快,但是Spring内部存在大量的类,添加此依赖,可以通过在编译时创建候选对象的静态列表来提高大型应用程序的启动性能。 |
spring-context-support-5.3.9.jar | 用来提供Spring上下文的一些扩展模块,例如实现邮件服务、视图解析、缓存、定时任务调度等 |
spring-core-5.3.9.jar | Spring 框架基本的核心工具类。Spring 其它组件要都要使用到这个包里的类,是其它组件的基本核心,当然你也可以在自己的应用系统中使用这些工具类。 |
spring-expression-5.3.9.jar | Spring表达式语言。 |
spring-instrument-5.3.9.jar | Spring3.0对服务器的代理接口。 |
spring-jcl-5.3.9.jar | Spring的日志模块。JCL,全称为"Jakarta Commons Logging",也可称为"Apache Commons Logging"。 |
spring-jdbc-5.3.9.jar | Spring对JDBC的支持。 |
spring-jms-5.3.9.jar | 这个jar包提供了对JMS 1.0.2/1.1的支持类。JMS是Java消息服务。属于JavaEE规范之一。 |
spring-messaging-5.3.9.jar | 为集成messaging api和消息协议提供支持 |
spring-orm-5.3.9.jar | Spring集成ORM框架的支持,比如集成hibernate,mybatis等。 |
spring-oxm-5.3.9.jar | 为主流O/X Mapping组件提供了统一层抽象和封装,OXM是Object Xml Mapping。对象和XML之间的相互转换。 |
spring-r2dbc-5.3.9.jar | Reactive Relational Database Connectivity (关系型数据库的响应式连接) 的缩写。这个jar文件是Spring对r2dbc的支持。 |
spring-test-5.3.9.jar | 对Junit等测试框架的简单封装。 |
spring-tx-5.3.9.jar | 为JDBC、Hibernate、JDO、JPA、Beans等提供的一致的声明式和编程式事务管理支持。 |
spring-web-5.3.9.jar | Spring集成MVC框架的支持,比如集成Struts等。 |
spring-webflux-5.3.9.jar | WebFlux是 Spring5 添加的新模块,用于 web 的开发,功能和 SpringMVC 类似的,Webflux 使用当前一种比较流程响应式编程出现的框架。 |
spring-webmvc-5.3.9.jar | SpringMVC框架的类库 |
spring-websocket-5.3.9.jar | Spring集成WebSocket框架时使用 |
注意:
如果你只是想用 Spring 的 IoC 功能,仅需要引入:spring-context 即可,将这个jar包添加到 classpath 当中
如果采用 maven 只需要引入 context 的依赖即可
Spring 6
XML
<!--Spring6 的正式版发布之前,这个仓库地址是需要的-->
<repositories>
<repository>
<id>repository.spring.milestone</id>
<name>Spring Milestone Repository</name>
<url>https://repo.spring.io/milestone</url>
</repository>
</repositories>
<dependencies>
<!--spring context依赖:使用的是6.0.0-M2里程碑版-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>6.0.0-M2</version>
</dependency>
</dependencies>
Spring 5
XML
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.23</version>
</dependency>
二、第一个 Spring 程序
配置依赖
XML
<!--
Spring 基础的依赖
若需要 JDBC、TX 等其他的依赖,需要再次添加
-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.23</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
实体类
java
package org.qiu.spring.bean;
/**
* @author 秋玄
* @version 1.0
* @email qiu_2022@aliyun.com
* @project Spring
* @package org.qiu.spring.bean
* @date 2022-10-30-16:49
* @since 1.0
*/
public class User {
}
编写配置文件
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">
<!-- Spring配置文件 -->
<!-- 文件名可自定义,最好存放在类路径,方便后期移植 -->
<!-- 配置 bean,Spring 才可以管理这个对象 -->
<!--
bean:
id: 这个 bean 的唯一表示,不能重复
class: 必须填写类的全路径类名(带包名)
-->
<bean id="userBean" class="org.qiu.spring.bean.User"></bean>
</beans>
测试类
java
@Test
public void testFirstSpringCode(){
// 获取 Spring 容器对象
// ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring配置文件的路径");
/**
* ApplicationContext 是一个接口
* ApplicationContext 接口下有很多实现类,其中一个叫做: ClassPathXmlApplicationContext
* ClassPathXmlApplicationContext 负责从类路径中加载 Spring 配置文件的对象
*
* new ClassPathXmlApplicationContext("spring.xml"); 的时候就会实例化对象,而不是在 getBean 的时候创建的对象
*/
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
// 根据 bean 的 id 获取对象
Object user = applicationContext.getBean("userBean");
System.out.println(user);
}
运行结果:org.qiu.spring.bean.User@5891e32e
三、第一个程序剖析
1、在 Spring 的配置文件中 id 不能重名
2、Spring 是通过调用类的无参数构造方法来创建对象的,所以要想让 Spring 给你创建对象,必须保证无参数构造方法是存在的
3、Spring 是如何创建对象的:
java
// dom4j解析beans.xml文件,从中获取class的全限定类名
// 通过反射机制调用无参数构造方法创建对象
Class clazz = Class.forName("com.powernode.spring6.bean.User");
Object obj = clazz.newInstance();
4、创建好的对象存储到一个 Map 当中
5、Spring 配置文件的名字是随意的
6、Spring 的配置文件可以有多个,在 ClassPathXmlApplicationContext 构造方法的参数上传递文件路径即可
7、Spring 配置文件中配置的 bean 可以任意类,只要这个类不是抽象的,并且提供了无参数构造方法
8、getBean() 方法调用时,如果指定的 id 不存在时不会返回 null,而是会出现异常 NoSuchBeanDefinitionException
9、getBean() 方法返回的类型是 Object,如果访问子类的特有属性和方法时,还需要向下转型,有其它办法可以解决这个问题吗?
java
// 指定创建对象的类型
User user = applicationContext.getBean("userBean", User.class);
10、ClassPathXmlApplicationContext 是从类路径中加载配置文件,如果没有在类路径当中,又应该如何加载配置文件呢?
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">
<bean id="vipBean2" class="com.powernode.spring6.bean.Vip"/>
</beans>
java
ApplicationContext applicationContext2 = new FileSystemXmlApplicationContext("d:/spring6.xml");
Vip vip = applicationContext2.getBean("vipBean2", Vip.class);
System.out.println(vip);
没有在类路径中的话,需要使用FileSystemXmlApplicationContext类进行加载配置文件
这种方式较少用。一般都是将配置文件放到类路径当中,这样可移植性更强
11、ApplicationContext 的超级父接口 BeanFactory
java
BeanFactory beanFactory = new ClassPathXmlApplicationContext("spring.xml");
Object vipBean = beanFactory.getBean("vipBean");
System.out.println(vipBean);
BeanFactory 是 Spring 容器的超级接口
ApplicationContext 是 BeanFactory 的子接口
从 Spring5 之后,Spring 框架支持集成的日志框架是 Log4j2
如何启用日志框架:
引入 Log4j2 的依赖
XML
<!--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>
在类的根路径下提供 log4j2.xml 配置文件(文件名固定为:log4j2.xml,文件必须放到类根路径下)
XML
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<loggers>
<!--
level指定日志级别,从低到高的优先级:
ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
-->
<root level="DEBUG">
<appender-ref ref="spring6log"/>
</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>
</appenders>
</configuration>
使用日志框架
java
Logger logger = LoggerFactory.getLogger(FirstSpringTest.class);
logger.info("我是一条日志消息");
一 叶 知 秋,奥 妙 玄 心