Spring是Java开发中至关重要的应用程序开发框架。Spring的核心功能是IoC容器、依赖注入和简化的AOP编程模型,依据这些核心特性,Spring发展出了一个庞大的生态,比如用于JavaWeb开发的SpringMVC,微服务的全套解决方案SpringCloud,以及负责整个Spring项目整合配置的SpringBoot等。我们日常Java开发中不可避免的会用到Spring框架,我们不仅要掌握Spring框架的用法,也要能够基于Spring扩展自己的功能,因此也必须了解框架的内部原理。
本系列笔记我们将以最新的Spring5版本为例,详细介绍Spring框架的方方面面。
Spring框架对自身做了详细的拆分,其中有三个核心依赖一般都是必须引入的:
core
:框架的基础类context
:容器上下文相关功能beans
:Bean装配相关功能<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.20</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.20</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.3.20</version>
</dependency>
注:Spring框架本身也在快速迭代,我们实际使用的依赖版本可能与以上不同。
除了核心依赖,Spring内部还依赖slf4j
进行日志输出,slf4j
实际上只是一组接口,我们还需要依赖其具体实现。目前比较常用的日志组件是logback
:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
启动Spring需要一组配置,比较传统的方式是使用xml
配置文件;此外如果使用SpringBoot则推荐使用JavaConfig,其实两者是等同的。
配置文件中定义了Spring框架需要的一些参数,以及需要加载的Bean等信息。大部分基于Spring或是与Spring进行整合的其他框架,都是通过配置Bean作为整个框架启动的入口。
如果是基于Servlet的JavaWeb工程,Spring一般通过配置Listener组件的方式启动;如果是普通Java工程,则需要我们使用类似如下代码手动启动:
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
上面代码中,我们通过加载classpath
下的applicationContext.xml
配置文件方式启动了Spring上下文。
如果正确的配置了日志框架,我们可以看到类似如下的DEBUG输出:
2022-05-18 12:16:27,045 DEBUG o.s.c.s.ClassPathXmlApplicationContext@[main] - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@5e025e70
2022-05-18 12:16:27,226 DEBUG o.s.b.f.x.XmlBeanDefinitionReader@[main] - Loaded 0 bean definitions from class path resource [applicationContext.xml]