Spring Framework(2)-Spring与开发模式演进

Spring生态演进:从Framework到Boot的架构解析与性能优化 依赖注入(DI)和控制反转(IoC)是现代Java框架的核心设计思想,Spring Framework通过其轻量级容器实现了这一范式。底层原理上,容器通过BeanDefinition管理对象生命周期,结合AOP代理机制实现横切关注点。这种架构显著提升了企业级应用的模块化程度,在微服务和云原生场景下体现技术价值。Spring Boot在此基础引入自动配置魔法,通过条件化装配(@Conditional)简化了传统XML配置,其内嵌容器设计使Web应用启动时间从分钟级缩短到秒级。性能优化方面,开发者需要关注IoC 阅读详情

点击查看更多Spring文章

目录

一、 JavaEE开发模式的演变

1.1、Model1时代

1.2、Model2时代

二、Spring:JavaEE开发者的春天到来

2.1、Spring如何通过IOC来达到解耦合的目的?

2.2、那么,怎么理解控制反转和依赖注入之间的关系?

2.3、依赖注入有什么好处?

三、 用Gradle构建Spring应用

3.1、使用Idea或者Eclipse创建Gradle项目并且导入Spring依赖

3.2、建立Spring配置文件

3.3、测试通过Spring获取实例

总结

 


 


在这里插入图片描述

 

一、 JavaEE开发模式的演变

系统地学习过Java的朋友肯定知道或者了解过,JavaEE的开发模式有着一系列的演变过程,如果简单地梳理,可以大概总结为:

 Model1时代
 Model2时代
 Spring时代
 EJB时代
 SSH时代
 SSM时代
 SpringBoot时代
 其他分布式、微服务开发....

1.1、Model1时代

Model1时代和Model2时代已经被视为JavaEE开发的老古董了,我们可以从下面的两张图来解释在没有Spring之前,JavaEE的传统开发模式:

  • Model1时代的开发模式
    在这里插入图片描述

在Model1时代中,所有的客户端请求都由JSP的内嵌代码块进行处理,JSP中的内嵌代码块调用JavaBean来进行相应的业务处理,再由JavaBean调用数据库,最后再依次返回处理结果响应给客户端。这种模式只适合小型的项目开发,对于业务逻辑复杂,业务处理多的情况下,在JSP中书写的内嵌代码将十分混乱,难以维护。

1.2、Model2时代

  • Model2时代
    在这里插入图片描述

由于Model1的开发模式中,JSP页面嵌入过多的业务处理代码,造成了视图和逻辑混合,杂乱无章,难以维护。这时,Model2模式应运而生,这个开发模式采用的Servlet作为一个控制器(后来出现了经典的Structs1、Structs2、SpringMVC框架等将其封装取代),用来接收所有来自客户端的请求,并且对请求进行转发给JavaBean,而最后又JavaBean请求数据库并且将结果响应给JSP页面中。

这时的JSP只负责视图层,即只负责”展示数据“,而Servlet复制“接收请求和处理请求”,这时候JavaEE项目的开发出现规范化的趋势,三层架构(3-tier architecture)的开发模式被采用,即将整个Web应用分为了三个大层次进行开发:界面层(User Interface layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data access layer)。区分层次的目的即为了“高内聚低耦合”的思想。

在Spring出现之前的JavaEE开发模式一直为这种模式,所以这被称为了“Model2时代”。在这时,一个Java Web项目的项目结构通常为下图:

在这里插入图片描述
这时,所有层次的调用都是通过手动创建的方式去获得的,例如一个Servlet请求一个Service接口,可能会这么写:


public class DemoServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		//创建一个DemoService
		DemoService service = new DemoService();
		//获得ID
		String pid = request.getParameter("pid");
		//通过ID查询
		Product product = service.findProductInfoById(pid);
		//....
}

二、Spring:JavaEE开发者的春天到来

Spring诞生于2003年,它颠覆了传统的Model2开发方式;因为Model2开发方式下,所有的实例都需要手动去创建,可是这引发了一系列问题:

1、每次都创建一个新的实例,实例的生命周期不一,过多的实例被创建会引发内存不足;
2、每次都需要手动地为其注入一些参数;
3、尽管可以使用单例模式来管理实例,让其全局只有唯一的实例,但是当实例数目多了以后,单例模式的应用将十分庞大
4、所有实例的关系错综复杂,不能很好地去管理
5、等等…

通过上述缺点,我们会想到如果将实例采用单例模式来管理,并且结合一个实例工厂形成一个“池子”是不是就更好去获取实例了呢?没错,这个池子就是Spring框架的最早原型了。

Spring是一个开放源代码的设计层面框架,它解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。

Spring的出现 ,代表着JavaEE开发春天的来临,它给JavaEE开发者带来许多便利:让Spring来管理常用的Bean、依赖关系更加清楚、通过元数据配置解耦合、提高了代码的整洁度和开发的效率等等。可以说,没有了Spring框架,就没有之后流行的EJB、SSH、SSM乃至今天的SpringBoot,这一点就可见其在JavaEE开发中的重要性了。

 

 

2.1、Spring如何通过IOC来达到解耦合的目的?

解耦合不代表着对象之间完全没有关联,而是存在一种弱关联关系,而不是强关联关系。如下面的齿轮:强关联齿轮改变了任何一个齿轮,其他齿轮都需要和它配合改变;而弱关联齿轮由于存在着中间适配齿轮的作用,其他齿轮改变了只需要和中间齿轮适配就可以了,不需要改变所有齿轮。

2.2、那么,怎么理解控制反转和依赖注入之间的关系?

DI指的是Dependency Injection,即依赖注入,它是Spring实现控制反转的基础,一般可以通过构造方法注入、setter方法注入。

也就是说,依赖注入是实现控制反转的基础,控制反转是一种思想,而不是一种技术;而依赖注入才是真真切切的技术!

2.3、依赖注入有什么好处?

依赖注入最大的作用是松掉上层类与下层依赖类的耦合,使我们无需从下层类开始手动地创建直到上层类,而是通过依赖注入关系,先创建上层类,再层层往下去创建所需的下层类依赖。这一系列过程都依赖于Spring IOC核心容器。

三、 用Gradle构建Spring应用

目前市场上的Jar包管理工具主要有三种,Maven、Gradle和Ant,现在我用Gradle来构建一个Spring应用:

3.1、使用Idea或者Eclipse创建Gradle项目并且导入Spring依赖

  • build.gradle
dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    //spring的依赖
    //Spring核心工具包
    compile group: 'org.springframework', name: 'spring-core', version: '4.3.18.RELEASE'
	//Spring配置相关
    compile group: 'org.springframework', name: 'spring-context', version: '4.3.17.RELEASE'
	//Spring Beans相关
    compile group: 'org.springframework', name: 'spring-beans', version: '4.3.12.RELEASE'
	//Spring配置支持
    compile group: 'org.springframework', name: 'spring-context-support', version: '4.3.14.RELEASE'
	//Spring AOP相关
    compile group: 'org.springframework', name: 'spring-aop', version: '4.3.18.RELEASE'
}

3.2、建立Spring配置文件

一般将Spring的主配置文件命名为applicationContext.xml,将其放在resource资源文件下,并且在文件里头添加以下头代码,引入命名空间,方便提示:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://www.springframework.org/schema/beans" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd 
">

 <!--bean--!>

</beans>

3.3、测试通过Spring获取实例

  • entity/Person
/**
 * @Auther: ARong
 * @Date: 2019/1/9 16:28
 * @Description: Person类
 */
public class Person implements Serializable{

    //id
    private int id;
    //name
    private String name;
    //age
    private int age;


    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Person() {
    }

    public Person(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
  • applicationContext.xml
<!--注册Person实体类-->
    <bean class="entity.Person" name="person" scope="prototype">
        <!--从setter注入-->
        <property name="id" value="1"/>
        <property name="name" value="arong"/>
        <property name="age" value="20"/>
    </bean>
  • BeansGetAndSetTest
@Test
    public void testGetBeans(){
        //读取配置中的元数据,并获得Spring工厂
         ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
         //获得person
        Person person = (Person) ac.getBean("person");
        //打印
        System.out.println(person.toString());
    }

出现以下结果,,基于Gradle的Spring应用已经构建完成:
在这里插入图片描述

 

总结

总结一下,使用Spring的最重要原因在于,它能够解除类与类、接口与接口之间复杂的耦合关系,让开发者无需理会依赖细节,我们只需要把对象交给Spring容器管理就可以了,而IOC是整个Spring的核心,但IOC是一种思想,而不是一种技术,所以DI才是支撑起IOC的真真切切的技术!

【云原生技术】Spring Framework Spring Boot 和 Spring Cloud的关系与区别 是一个开源框架,旨在简化 Java 企业级应用程序的开发。控制反转(IoC):通过 IoC 容器管理对象的创建和生命周期,提高松耦合性。面向切面编程(AOP):支持横切关注点的处理,例如日志记录和事务管理。数据访问:方便地集成各种数据访问技术,如 JDBC 和 Hibernate。Web 开发支持:提供 Spring MVC 构建 Web 应用程序的能力。是 Spring Framework 的一个子项目,旨在简化 Spring 应用程序的配置和开发过程。 阅读详情

相关推荐

深入解析Spring Framework 5.2.25.RELEASE源码

在本章中,我们将简要探讨Spring Framework 5.2.25.RELEASE版本的核心特性,从而为读者提供一个全面的概览。Spring Framework,作为Java开发者最常用的开源框架之一,其版本更新历来备受关注。本章节的重点是梳理新版本中关键特性的更新,包括但不限于编程模型的改进、响应式编程的支持、新的依赖注入机制和安全性提升。

weixin_29717341的博客 1016

Spring 技术生态全景解析:从 Spring Framework 到 Spring Cloud 的演进之路

本文针对Java开发者梳理Spring技术生态演进脉络,涵盖Spring Framework、Spring MVC、Spring Boot和Spring Cloud的核心功能与适用场景。Spring Framework以IoC/DI和AOP为基础容器;Spring MVC成为Web开发标准框架;Spring Boot通过自动配置简化开发;Spring Cloud提供微服务治理能力。文章对比各技术特性并给出选型建议:小型项目推荐Spring Boot+Spring MVC,大型系统采用Spring Cloud

聚焦学生开发者需求,分享课设毕设项目实战经验、系统开发技巧、数据库设计规范及文档排版实用方法。 1940

2、Spring Framework 5.0:演进与特性解析

本文详细解析了Spring Framework从1.0版本发布以来的演进历程,重点介绍了其简化Java企业应用开发的核心特性,包括依赖注入、减少样板代码、架构灵活性等。同时深入探讨了Spring Framework 5.0的重大升级,如响应式编程支持、对JDK 8和Java EE 7的基线升级、功能性Web框架、Java模块化与Jigsaw支持、Kotlin语言兼容性等内容。此外,还分析了Spring生态体系中的相关项目(如Spring Boot、Spring Cloud、Spring Data等)的应用场

gin88的博客 168

从 XML 到响应式:一文读懂 Spring Framework 各版本核心演进

无论选择哪个版本,Spring 始终以 “简化开发” 为核心,开发者可根据项目的技术栈、部署环境及未来规划,合理选择版本并享受框架带来的效率红利。@Configuration 替代 XML。JDK 与 Jakarta EE 迁移。WebSocket 与反应式前奏。响应式 WebFlux 诞生。Lambda 与函数式支持。AOT 编译与原生镜像。REST 与验证增强。

汪成龙 1319

Spring Framework 5.0.2 中文注释版深度解析与实战

Spring框架自诞生以来,便以其模块化设计、松耦合结构与高度可扩展性,成为Java企业级开发的核心框架。它不仅提供了IoC容器和AOP支持,还通过模块化设计实现了高度解耦与灵活性,适用于从单体架构到微服务架构的各类项目。其核心组成部分包括:Bean容器(负责对象的创建与管理)、核心容器模块(如)以及支持AOP、数据访问、Web开发等的扩展模块。Spring的设计理念强调“依赖注入”与“控制反转。

weixin_42430341的博客 895

Spring Framework 3.2源码深度解析与Gradle编译实战

Spring Framework 3.2奠定了现代Java企业级开发的基石,其核心特性围绕控制反转(IoC)面向切面编程(AOP)声明式事务管理和Web MVC架构四大支柱展开。该版本采用模块化设计,分为spring-aopspring-web等子模块,各模块职责清晰且高度内聚。// 典型IoC配置示例(XML)</bean>上述配置体现了Spring 3.2对XML与注解双模式的支持:既可通过<bean>定义组件,也可使用@Component。

weixin_42153793的博客 946

Spring技术栈深度解析:从Framework到Boot的演进与实践

Spring技术栈作为Java企业级开发的核心框架,其核心机制包括IoC(控制反转)和AOP(面向切面编程)。IoC容器通过管理Bean的生命周期实现组件解耦,而AOP则通过动态代理技术实现横切关注点的模块化。Spring Boot基于约定优于配置的原则,通过自动配置和Starter机制大幅简化了项目搭建过程。在企业级应用中,Spring技术栈广泛应用于Web开发、分布式事务、缓存优化和消息队列等场景。本文结合金融、电商等实际项目案例,深入解析Spring Framework、Spring Boot和Spr

weixin_34417183的博客 314

DEXPI与Proteus XML:解锁过程工业P&ID数据互操作性的技术核心

本文深入探讨了DEXPI与Proteus XML在过程工业P&ID数据互操作性中的核心技术。通过解析DEXPI标准的开源特性和Proteus XML的架构设计,揭示了其在跨平台数据交换中的关键作用,并结合CADMATIC和西门子COMOS的实战案例,展示了如何实现高效的数据集成与转换。

weixin_29195615的博客 385

从 J2EE 到云原生:Spring Framework 的设计哲学与演进之路

面对复杂的 J2EE,它没有另立标准,而是用更轻量的方式集成规范。面对 Jakarta EE 的包名变更,它果断升级基线,始终保持前沿兼容性。面对云原生和 DevOps 的浪潮,它借助 Spring Boot 和 WebFlux 重新定义了应用交付方式。从 2003 年到 2026 年,Spring 已经走过了二十余年的历程。从最初的轻量级容器到如今的响应式、云原生、模块化全面支持,Spring 始终保持着旺盛的生命力。理解这些背景,不仅能帮助我们更好地应对每一次技术升级,更能让我们。

m0_37607945的博客 366

PCIe 6.0实战指南:从链路训练到信号完整性的避坑手册

本文是一份针对PCIe 6.0硬件工程师的实战避坑指南。文章深入解析了从NRZ到PAM4调制带来的信号完整性挑战,详细拆解了链路训练(LTSSM)的复杂过程与调试方法,并提供了从信道仿真到实验室实测(如使用Keysight示波器进行眼图与误码率分析)的完整信号完整性闭环验证策略,帮助工程师解决高速率下的链路不稳定与降速问题。

weixin_29306875的博客 344

MacOS新手必看:HomeBrew安装避坑指南(含M1芯片适配方案)

本文为MacOS新手提供全面的HomeBrew安装指南,特别包含M1/M2芯片适配方案。从系统准备到核心安装流程,再到日常维护和高级配置,详细解析每个步骤的潜在问题及解决方案,帮助用户高效管理Mac软件。

weixin_28831399的博客 471

一文熟练掌握Spring Framework

学习和掌握spring框架,看这篇就足够了

勇往直前的博客 811

dToF直方图之美

上面视频里如果你能看懂,那么就能理解对于dToF单点的测距问题,对于大部分的描述在AMS和ST里的手册都非常的详细,有疑问的可以后台来找我探讨,今天我们单纯从上层讨论成像的问题。作为dToF算法工程师,应该是对直方图敏感的,直方图的每个Count峰都会表征出问题,因为dToF的输出只有直方图,观察直方图能够逆推出dToF的很多东西,这也是大多数公司不愿意开放直方图和Raw data的缘故。以上是一个小面阵的分辨率,第一张是直方图,后面是基于直方图寻峰出来的成像ToF图,Peak图,以及噪声Noise图。

dream it possible 2995

Spring Framework:Java 开发的基石与 Spring 生态的起点

【摘要】SpringFramework作为Java企业级开发的里程碑式框架,通过IoC控制反转和AOP面向切面编程两大核心技术,彻底改变了传统Java开发模式。其轻量级架构简化了企业应用开发,提供了数据访问、Web开发等核心功能模块,并衍生出SpringBoot、SpringCloud等子项目,构建了完整的Spring生态系统。学习SpringFramework不仅是掌握现代Java开发的必备技能,更能帮助开发者理解软件设计思想,提升代码架构能力,是打开Java企业级开发大门的"金钥匙"

sengminPark的博客 1387

ANPC三电平拓扑双脉冲试验的原理与实施

ANPC三电平拓扑因损耗低、谐波小、应力均衡而广泛应用,但其存在短、长两类换流通道,寄生电感和开关应力差异显著。短通道尖峰小、可靠性高;长通道应力严苛。因此需分别制定两套独立双脉冲测试方案,针对不同时段和器件(如T1、T5、T6、T4及对应二极管)全面考核开关特性。

嵌入式老牛的博客 353

YOLOv11模型改进全攻略:利用轻量化模块实现精度与速度双跃升

如果你在实操中遇到模块替换导致的精度骤降或部署报错,不妨尝试调整轻量化模块的替换比例,或针对性地保留关键层的原始结构。记住,轻量化的核心是“在精度损失可接受的范围内最大化提升效率”,只要结合业务场景灵活取舍,你也能让YOLOv11在资源受限的环境中大放异彩。接下来,我们从模块选型到代码集成,一步步带你打造“轻量且能打”的YOLOv11,真正帮你解决工业落地中的效率与精度痛点。训练过程中关注模型的mAP和推理速度,若精度下降过多,可调整模块替换的比例(如仅替换Backbone的部分卷积层)。

m0_64661770的博客 502

Jackson 1.x到2.x的演进与Spring集成

Override时间线技术栈建议2010–2013仅维护旧系统2013–2016Spring 4.x + Jackson 2.x 过渡期主动迁移,替换包名和注解2016 至今使用,避免include属性未来拥抱 Java 17+,利用新特性(record、sealed class)

m0_37607945的博客 1341

【docker】第10篇 Failed with result ‘exit-code和Start request repeated too quickly和Failed to start Docker

【docker】解决 Failed with result 'exit-code'和Start request repeated too quickly和Failed to start Docker。

Fanjufei的博客 6821

spring 官方下载地址(Spring Framework 3.2.x&Spring Framework 4.0.x)

本文转自:点击打开链接 SPRING官方网站改版后,建议都是通过 Maven和Gradle下载,对不使用Maven和Gradle开发项目的,下载就非常麻烦,下给出Spring Framework jar官方直接下载路径: http://repo.springsource.org/libs-release-local/org/springframework/s

zhuyucheng123的专栏 6万+

面经-2023-哲库Zeku-数字芯片设计

面经-2023-哲库Zeku-数字芯片设计

w0shishabi的博客 3908

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Spring Framework 2.1 升级到 Spring Framework 2.5 是一个重要的版本更新

虽然许多新的主要功能固有地需要Java 5或更高版本,但Spring 2.5还包括Java 1.4用户也可以使用的重要增强功能: bean名称切入点元素,jms配置名称空间,经过认证的WebSphere支持和JCA RAR部署选项。:注解直接写在代码中,使得代码的意图更加明确,增强了代码的可读性和自解释性。这些更新不仅提升了 Spring Framework 的功能性和灵活性,还大大改善了开发者的开发体验和应用的性能表现。等注解,可以方便地实现横切关注点的分离,从而提高代码的复用性和可维护性。

[Blog][Domain] programb.blog.youkuaiyun.com 451

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Spring Framework 核心技术解析:从历史演进到设计哲学

你是否还在为复杂的J2EE开发而头疼?是否还在手动管理对象依赖关系?Spring Framework的出现彻底改变了Java企业级开发的格局。本文将深入解析Spring Framework的核心技术体系,从其历史演进脉络到深层的设计哲学,为你呈现一个完整的Spring技术全景图。 读完本文,你将获得: - Spring Framework完整的技术架构理解 - 控制反转(IoC)和依赖注入(DI...

gitblog_01148的博客 335

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Spring Framework 5.2 重磅升级全解析

Spring Framework 5.2 发布摘要(150字) Spring Framework 5.2(2019年发布)是5.x系列的重要更新,现生命周期已结束(2024年8月终止维护)。核心改进包括:1)重构注解检索机制,需确保自定义注解标注@Retention(RUNTIME);2)Web层破坏性变更,如无path的@RequestMapping现仅匹配根路径;3)弃用路径扩展功能,推荐使用Accept头;4)增强Kotlin支持与响应式事务;5)性能优化如@Configuration轻量模式。

m0_37607945的博客 1605

spring 官方下载地址(Spring Framework 3.2.x&Spring Framework 4.0.x

spring 官方下载地址(Spring Framework 3.2.x&Spring Framework 4.0.x 转载▼ 转:http://hi.baidu.com/jaimy_jie/item/d699cecdc5d3a354bdef6990 SPRING官方网站改版后,下载spring非常麻烦,下给出官方直接下载路径: http://rep

zujiahao的博客 518

Mybatis学习笔记(6)-MyBatis updateByExample和updateByExampleSelective的区别

我们在使用MyBatis时,通常使用逆向工程工具生成一套接口和xml映射文件用于简单的单表操作,而其中有两个比较常用的接口方法,一个是 updateByExample ,一个是 updateByExampleSelective ,它们的作用是对数据库进行更新操作。 通过查看逆向工程的xml映射文件可以发现,这两个方法的区别是: updateByExample需要将表的条件全部给出,比...

BoringError的博客 5万+
上一篇: Spring Framework(1)-入门与基础操作总结
下一篇: Spring Framework(3)-IOC与DI总结
BoringRong
BoringRong 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 2万+粉丝 386原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BoringRong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值