Spring 是用于开发 Java Enterprise Edition 应用程序的最广泛使用的框架。 此外,Spring 的核心特性可用于开发任何 Java 应用程序。
使用它的扩展在 Jakarta EE 平台之上构建各种 Web 应用程序。 也可以在简单的独立应用程序中使用它的依赖注入的特性。
Spring 的目标是让 Jakarta EE 开发更容易:
依赖注入是控制反转 (IoC) 的一个方面,是一个通用概念,它表明我们不会手动创建对象,而是描述它们应该如何创建。 然后,如果需要,IoC 容器将实例化所需的类。
为了注入 Spring bean,存在一些不同的选项:
推荐的方法是对强制依赖项使用构造函数参数,对可选依赖项使用 setter。 这是因为构造函数注入允许向不可变字段注入值并使测试更容易。
BeanFactory 是一个接口,表示提供和管理 bean 实例的容器。 默认实现在调用 getBean() 时延迟实例化 bean。
相比之下,ApplicationContext 是一个接口,代表一个容器,其中包含应用程序中的所有信息、元数据和 bean。 它还扩展了 BeanFactory 接口,但默认实现会在应用程序启动时急切地实例化 bean。 但是,可以为单个 bean 覆盖此行为。
Spring Bean 是由 Spring IoC 容器初始化的 Java 对象。
默认情况下,Spring Bean 被初始化为单例。
为了设置Spring Bean的作用域,可以在XML配置文件中使用@Scope注解或“scope”属性。 请注意,有五个受支持的范围:
不,单例 bean 不是线程安全的,因为线程安全是关于执行的,而单例是一种专注于创建的设计模式。 线程安全仅取决于 bean 实现本身。
首先,需要根据 Java 或 XML bean 定义实例化 Spring bean。 可能还需要执行一些初始化以使其进入可用状态。 之后,当不再需要 bean 时,它将从 IoC 容器中删除。
这是以类型安全的方式配置基于 Spring 的应用程序的方法之一。 它是基于 XML 的配置的替代方案。
可以,在大型项目中,建议使用多个 Spring 配置以提高可维护性和模块化。
可以加载多个基于 Java 的配置文件:
@Configuration
@Import({
MainConfig.class, SchedulerConfig.class})
public class AppConfig {
Spring Security 是 Spring 框架的一个独立模块,它专注于在 Java 应用程序中提供身份验证和授权方法。 它还处理了大多数常见的安全漏洞,例如 CSRF 攻击。
要在 Web 应用程序中使用 Spring Security,可以从简单的注解 @EnableWebSecurity 开始。
Spring Boot 是一个提供预配置框架集以减少样板配置的项目。 通过这种方式,可以使用最少的代码启动并运行 Spring 应用程序。
单例模式——单例范围的bean
工厂模式——Bean 工厂类
原型模式——原型范围的bean
适配器模式 – Spring Web 和 Spring MVC
代理模式——Spring Aspect-Oriented Programming 支持
模板方法模式——JdbcTemplate、HibernateTemplate 等。
前端控制器 – Spring MVC DispatcherServlet
数据访问对象——Spring DAO 支持
模型视图控制器 – Spring MVC
范围原型意味着每次调用 Bean 的实例时,Spring 都会创建一个新实例并返回它。 这与默认的单例作用域不同,默认的单例作用域每个 Spring IoC 容器实例化单个对象实例一次。
可以通过实现 Spring-aware 接口来实现。 完整列表可在此处获得。
还可以在这些 bean 上使用 @Autowired 注解:
@Autowired
ServletContext servletContext;
@Autowired
ServletConfig servletConfig;
简单来说,DispatcherServlet 处理的所有请求都被定向到用@Controller 注解的类。 每个控制器类将一个或多个请求映射到使用提供的输入处理和执行请求的方法。
@RequestMapping 注解用于将 Web 请求映射到 Spring Controller 方法。 除了简单的用例之外,还可以使用它来映射 HTTP 标头、将 URI 的一部分与 @PathVariable 绑定,以及使用 URI 参数和 @RequestParam 注释。
Spring JDBC 模板是主要的 API,通过它可以实现据库操作逻辑:
为了使用,需要定义 DataSource 的简单配置:
@Configuration
@ComponentScan("com.spring.demo")
public class SpringJdbcConfig {
@Bean
public DataSource mysqlDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/springjdbc");
dataSource.setUsername("user");
dataSource.setPassword("password");
return dataSource;
}
}
有两种不同的方式来配置事务——使用注解或使用面向方面的编程(AOP)——每种方法都有其优点。
根据官方文档,以下是使用 Spring Transactions 的好处:
Spring 数据访问对象 (DAO) 是 Spring 提供的支持,用于以一致且简单的方式使用数据访问技术,如 JDBC、Hibernate 和 JPA。
切面通过向现有代码添加额外行为而不修改受影响的类来实现横切关注点的模块化,例如跨越多种类型和对象的事务管理。
根据官方文档,编织是一个将方面与其他应用程序类型或对象联系起来以创建建议对象的过程。 这可以在编译时、加载时或运行时完成。 Spring AOP 与其他纯 Java AOP 框架一样,在运行时执行编织。
反应式编程是关于非阻塞的、事件驱动的应用程序,它使用少量线程进行扩展,背压是一个关键因素,旨在确保生产者不会压倒消费者。
这些是反应式编程的主要好处:
反应式编程通常是事件驱动的,而反应式系统则是消息驱动的。 所以,使用反应式编程并不意味着正在构建一个反应式系统,这是一种架构风格。
但是,如果遵循响应式宣言,响应式编程可以用作实现响应式系统的一种手段,这对理解非常重要。
基于此,反应式系统具有四个重要特征:
Spring WebFlux 是 Spring 的响应式堆栈 Web 框架,它是 Spring MVC 的替代方案。
为了实现这种反应式模型并具有高度可扩展性,整个堆栈是非阻塞的。