Spring 其实是一个很大的范围概称,包含着许多分支,在正式了解 Spring 之前,我们先来看看 Spring 家族中的主要分支:
Spring 领域中其他一切的基础,提供了 核心容器和依赖注入框架,还提供了一些基本数据持久性支持,特别是基于模板的 JDBC 文件。
Spring Boot 不仅提供了 启动依赖和自动配置,还提供了如下的其他特性:
将应用程序的数据存储库抽象为简单的 Java 接口,同时当定义方法用于驱动数据进行存储和检索的问题时,对方法使用了命名约定。此外还能处理几种不同类型的数据库,包括包括关系型(JPA)、文档型(Mongo)、图型(Neo4j)等。
Spring Security 解决了广泛的应用程序安全性需求,包括身份验证、授权和 API 安全性等一系列工作。
Spring Integration 解决了实时集成,即数据在可用时进行处理。相反,Spring Batch 解决了批量集成的问题,允许在一段时间内收集数据,直到某个触发器(可能是一个时间触发器)发出信号,表示该处理一批数据。
Spring Cloud 是一组用 Spring 开发云本地应用程序的项目。
Spring 是为了减少 EJB 的复杂性而创建的一套解决方案,而 EJB 过于臃肿,使用 Spring 能够让 Java Bean 之间进行有效的解耦。而且 Spring 不仅仅局限于服务端的开发,在测试性和松耦合方面均有较好表现。
我们日常所说的 Spring,实际上指的是 Spring Framework,属于 Spring 家族的一个分支。
Spring 的核心是一个 容器,常称为 Spring 应用程序上下文,用于创建和管理应用程序组件。组件(或 Bean)在 Spring 应用程序上下文中连接在一起从而构成一个完整的应用程序。
那么是如何将各种 Bean 连接在一起呢?这就是 Spring 中最重要的特性之一:依赖注入(DI)。
依赖注入(DI):通过依赖注入的应用程序 不是 由组件自身创建和维护其所依赖的其他 Bean 的生命周期,而是依赖于单独的实体(容器)来创建和维护所有组件,并将这些组件注入需要他们的 Bean。
图片源自网络
Spring 是一个分层架构,主要由如下 7 大模块所构成。Spring 模块位于核心容器,定义了创建、配置和管理 Bean 的方式。
对于之前的版本,Spring 容器将各个组件连接起来的方式是通过 XML 配置,但现在的版本中更多的是使用基于 Java 的配置,如下面基于 XML 的配置等效于基于 Java 的配置。
<bean id="inventoryService" class="com.example.InventoryService" />
<bean id="productService" class="com.example.ProductService" >
<constructor-arg ref="inventoryService" />
</bean>
@Configuration
public class ServiceConfiguration{
@Bean
public InventoryService inventoryService(){
return new InventoryService();
}
@Bean
public ProductService productService(){
return new ProductService(inventoryService);
}
}
在基于 Java 的配置中,@Configuration
向 Spring 表明该类是一个配置类,为 Spring 应用程序上下文提供 Bean。而 @Bean
注解则指示类方法返回的对象应作为 Beans 添加到应用程序上下文中。
那你可能想,既然之前有了 XML 配置的方式,那么为什么后来的版本中又加入了基于 Java 的配置方式呢?基于 Java 的配置方式相比于 XML 的配置方式,包含了更高的类型安全性和更高的可重构性。而且仅当 Spring 无法自动配置组件时,才需要通过 XML 的配置方式 或者 基于 Java 的配置方式 来进行显式配置。
自动配置 即 自动装配 + 组件扫描。有赖于 组件扫描,Spring 能 自动从应用程序的类路径中发现组件,同时将其创建为 Spring 应用程序上下文中的 Bean。而通过 自动装配,Spring 将自动将组件与其所依赖的其他 Bean 一起注入。
最近随着 Spring Boot 的推出,自动配置的优势进一步加强,在这种配置中,Spring Boot 将根据 类路径中的条目、环境变量和其他因素,合理猜测所需配置的组件,将其连接在一起。Spring Boot 中的自动配置大大减少了构建应用程序所需的显式配置的数量,增强了 Spring 开发的能力。
对于一个 Spring 项目而言,其结构主要包括以下部分:
src/main/java
:该目录主要包含应用程序的源码,主要可分为如下几类:build
:工程启动类;domain
:实体类;dao
:数据访问层;service
:数据服务层,业务类代码;controller
:前端访问控制器;config
:配置信息类;utils
:工具类;constant
:常用接口类;vo
:数据传输类;Application.java
:项目的启动类;src/main/resources
:相关资源文件。src/test/java
:测试相关代码。src/test/resources
:测试相关资源。pom.xml
:Maven 构建规范,包含一些项目及依赖方面的配置。项目启动类,即运行 jar 文件时用来引导应用程序执行的类,也就是项目结构中的 Application.java
,下面是一个项目启动类的实例:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class TacoCloudApplication {
public static void main(String[] args) {
SpringApplication.run(TacoCloudApplication.class, args);
}
}
其中 @SpringBootApplication
注解说明该类是一个 Spring 引导应用程序,但实际上它是组合了下列三个注解的复合应用注解:
@SpringBootConfiguration
:指定该类为配置类。@EnableAutoConfiguration
:启用 Spring 自动配置。@ComponentScan
:启用组件扫描。允许声明其他带有 @Component
、@Controller
、@Service
等注解的类,以便让 Spring 自动发现他们并将他们注册为 Spring 应用程序上下文中的组件。作者 | 村雨遥