1.Spirng是什么?
Spring 是一个分层的 轻量级开源框架,专为简化企业级Java应用开发而设计。
它由Rod Johnson于2003年提出,核心目标是解决企业应用开发的复杂性,通过 控制反转(IoC) 和 面向切面编程(AOP) 实现低耦合和高内聚的代码结构。Spring框架覆盖了从数据访问、事务管理到Web开发的全栈功能,提供一站式(full-stack)解决方案,支持Java SE/EE应用的快速构建.
Spring通过IoC和AOP两大核心技术,结合分层架构和模块化设计,成为企业级Java开发的首选框架。其优势体现在简化开发流程、提升代码质量、支持多样化技术栈整合等方面,适用于从传统单体应用到现代云原生系统的全场景需求
2.Spring的特点和优势
2.1 Spring特点
轻量——从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。
非侵入式设计——Spring对代码的污染极低,开发者无需强制继承或实现特定接口,仅需通过配置或注解即可集成功能,保持代码的简洁性
控制反转 ——Spring通过一种称作控制反转(IoC)的技术促进了低耦合。~~当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。~~它的底层设计模式采用了工厂模式,所有的 Bean 都需要注册到Bean工厂中,将其初始化和生命周期的监控交由工厂实现管理。程序员只需要按照规定的格式进行Bean开发,然后利用XML文件进行bean 的定义和参数配置,其他的动态生成和监控就不需要调用者完成,而是统一交给了平台进行管理。 控制反转是软件设计大师 Martin Fowler在 2004 年发表的”Inversion of Control Containers and the Dependency Injection pattern”提出的。这篇文章系统阐述了控制反转的思想,提出了控制反转有依赖查找和依赖注入实现方式。控制反转意味着在系统开发过程中,设计的类将交由容器去控制,而不是在类的内部去控制,类与类之间的关系将交由容器处理,一个类在需要调用另一个类时,只要调用另一个类在容器中注册的名字就可以得到这个类的实例,与传统的编程方式有了很大的不同,“不用你找,我来提供给你”,这就是控制反转的含义 。
面向切面——Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。将日志、事务、安全等横切关注点模块化,通过动态代理实现功能植入,避免代码重复
容器——Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。
框架——Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。
MVC——Spring的作用是整合,但不仅仅限于整合,Spring 框架可以被看做是一个企业解决方案级别的框架。客户端发送请求,服务器控制器(由DispatcherServlet实现的)完成请求的转发,控制器调用一个用于映射的类HandlerMapping,该类用于将请求映射到对应的处理器来处理请求。HandlerMapping 将请求映射到对应的处理器Controller(相当于Action)在Spring 当中如果写一些处理器组件,一般实现Controller 接口,在Controller 中就可以调用一些Service 或DAO 来进行数据操作 ModelAndView 用于存放从DAO 中取出的数据,还可以存放响应视图的一些数据。 如果想将处理结果返回给用户,那么在Spring 框架中还提供一个视图组件ViewResolver,该组件根据Controller 返回的标示,找到对应的视图,将响应response 返回给用户。
2.2 Spring的优势
1.方便解耦,简化开发
通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。有了Spring,用户不必再为单实例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。
2.AOP编程的支持
通过Spring提供的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付。
3.声明式事务的支持
在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,提高开发效率和质量。
4.方便程序的测试
可以用非容器依赖的编程方式进行几乎所有的测试工作,在Spring里,测试不再是昂贵的操作,而是随手可做的事情。例如:Spring对Junit4支持,可以通过注解方便的测试Spring程序。
5.方便集成各种优秀框架
Spring不排斥各种优秀的开源框架,相反,Spring可以降低各种框架的使用难度,Spring提供了对各种优秀框架(如Struts,Hibernate、Hessian、Quartz)等的直接支持。
6.降低Java EE API的使用难度
Spring对很多难用的Java EE API(如JDBC,JavaMail,远程调用等)提供了一个薄薄的封装层,通过Spring的简易封装,这些Java EE API的使用难度大为降低。
7.Java 源码是经典学习范例
Spring的源码设计精妙、结构清晰、匠心独运,处处体现着大师对Java设计模式灵活运用以及对Java技术的高深造诣。Spring框架源码无疑是Java技术的最佳实践范例。如果想在短时间内迅速提高自己的Java技术水平和应用开发水平,学习和研究Spring源码将会使你收到意想不到的效果。
3.Spring的结构
Spring 框架提供约 20 个模块,可以根据应用程序的要求来使用。
4.核心容器
核心容器由 spring-core,spring-beans,spring-context,spring-context-support和spring-expression(SpEL,Spring 表达式语言,Spring Expression Language)等模块组成,它们的细节如下:
- spring-core 模块提供了框架的基本组成部分,包括 IoC 和依赖注入功能。
- spring-beans 模块提供 BeanFactory,工厂模式的微妙实现,它移除了编码式单例的需要,并且可以把配置和依赖从实际编码逻辑中解耦。
- context 模块建立在由 core和 beans 模块的基础上建立起来的,它以一种类似于 JNDI 注册的方式访问对象。Context 模块继承自 Bean 模块,并且添加了国际化(比如,使用资源束)、事件传播、资源加载和透明地创建上下文(比如,通过 Servelet 容器)等功能。Context 模块也支持 Java EE 的功能,比如 EJB、JMX 和远程调用等。ApplicationContext 接口是 Context 模块的焦点。spring-context-support 提供了对第三方集成到 Spring 上下文的支持,比如缓存(EhCache, Guava, JCache)、邮件(JavaMail)、调度(CommonJ, Quartz)、模板引擎(FreeMarker, JasperReports, Velocity)等。
- spring-expression 模块提供了强大的表达式语言,用于在运行时查询和操作对象图。它是 JSP2.1 规范中定义的统一表达式语言的扩展,支持 set 和 get 属性值、属性赋值、方法调用、访问数组集合及索引的内容、逻辑算术运算、命名变量、通过名字从 Spring IoC 容器检索对象,还支持列表的投影、选择以及聚合等。
5.Spirng第一个案例
一:配置spring环境
1.1 创建一个项目
使用maven-webapp模板
1.2 导入spring依赖环境
- 在使用spring前,先要了解spirng运行的所需环境
Spring Framework与JDK版本对应表:
Spring Framework版本 | JDK版本 |
---|---|
6.0.x | DK 17-21 |
5.3.x | JDK 8-19 |
5.2.x | JDK 8-15 |
5.1.x | JDK 8-12 |
5.0.x | JDK 8-10 |
4.3.x | JDK 6-8 |
同时,Spring Framework各版本的生命周期如下:
版本 | 说明 |
---|---|
5.3.x | 第 5 代的最后一个特性分支,在 JDK 8、JDK 11、JDK 17 上提供长期支持 |
5.2.x | 将积极支持到 2021 年底 |
5.1.x 和 5.0.x | 不再受到积极支持,自 2020 年 12 月起被 5.2.x 和 5.3.x 取代。 |
4.3.x | 于2020 年 12 月 31 日停止维护 |
3.2.x | 于 2016 年 12 月 31 日停止维护 |
- 导入依赖
<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.39</version>
</dependency>
二:编写相关代码
2.1 编写一个javabean
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Student {private int stu_id;private String stu_name;private int stu_age;
}
2.1 配置spring所需xml文件,spring-config.xml
创建在resource资源包下
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><!--在spring-beans.xml文件中编写IoC控制反转,将该文件导入到spring-config.xml文件中--><context:component-scan base-package="org.spring"/><import resource="springbeans.xml"/>
</beans>
三:测试代码
3.1 编写测试类代码
public class Test1 {public static void main(String[] args) {//加载配置文件,获取连接ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");//获取对象方式1Student stu = (Student)context.getBean("stu");//获取对象方式2(推荐使用)Student student = context.getBean("student", Student.class);System.out.println(stu);}
}
3.2 运行结果
Student(stu_id=0, stu_name=null, stu_age=0)