Spring框架学习 -- 核心思想

简介: Spring框架学习 -- 核心思想


(1) Spring是什么?

       我们常说的Spring的全称是: Spring Framework(Spring框架), 它是一个开源的框架, 有着活跃而且庞大的社区, 这就是它之所以能长久不衰的原因, Spring 支持广泛的应用场景, 他可以让java企业级的应用程序开发变得非常简单

       用一句话概括就是, Spring是包含了众多工具方法的IOC容器

(2) 什么是IOC容器?

       想到容器我们就可以和java的集合体系来做对比, 集合体系里面, 就拿list类来讲, list里面设置泛型之后就可以存放对应的数据, 相同的包括我们曾经使用的tomcat也是如此, tomcat是一个web应用程序的容器, 它负责将webApp发布到网络.

(3) 从传统开发认识spring

        假如我们要构建一辆车的程序, 我们可以思考一下, 一辆车需要以下这几个部件:

  • 车身(Framework)
  • 底盘(Bottom)
  • ......(中间还可以有很多部件,这里只列举几个即可)
  • 轮胎(Tire)

       上面的三个部件(车身, 底盘, 轮胎) 构成一辆车, 形成了下面的流程图:  

        从上图可以看出构建一辆车需要依赖于车身, 构建车身又要依赖于底盘, 相同的, 构建底盘也要依赖于轮胎, 这样层层依赖, 最终我们可以类比此过程来 简单用代码实现这个过程:

public class NewCarExample {
            public static void main(String[] args) {
                Car car = new Car();
                car.init();
            }
            /**
             * 汽⻋对象
             */
            static class Car {
                public void init() {
                    // 依赖⻋身
                    Framework framework = new Framework();
                    framework.init();
                }
            }
            /**
             * ⻋身类
             */
            static class Framework {
                public void init() {
                    // 依赖底盘
                    Bottom bottom = new Bottom();
                    bottom.init();
                }
            }
            /**
             * 底盘类
             */
            static class Bottom {
                public void init() {
                    // 依赖轮胎
                    Tire tire = new Tire();
                    tire.init();
                }
            }
            /**
             * 轮胎类
             */
            static class Tire {
 
                // 尺⼨
                private int size = 30;
                public void init() {
                    System.out.println("轮胎尺⼨:" + size);
                }
            }
        }

(4) 这种传统开发的缺陷

        以上过程的轮胎尺寸是固定的, 然而随着对车的需求量的增大, 不同需求的轮胎尺寸孕育而生, 为了满足日益增长的个性化需求, 就需要加工多种不同的轮胎尺寸, 这个时候针对不同的尺寸就需要对上面的代码进行修改了:

public class NewCarUpdateExample {
            public static void main(String[] args) {
                Car car = new Car(20);
                car.run();
            }
            /**
             * 汽⻋对象
             */
            static class Car {
                private Framework framework;
                public Car(int size) {
                    framework = new Framework(size);
                }
                public void run() {
                    // 依赖⻋身
                    framework.init();
                }
            }
            /**
             * ⻋身类
             */
            static class Framework {
                private Bottom bottom;
                public Framework(int size) {
                    bottom = new Bottom(size);
                }
                public void init() {
                    // 依赖底盘
                    bottom.init();
                }
            }
            /**
             * 底盘类
             */
            static class Bottom {
                private Tire tire;
 
                public Bottom(int size) {
                    tire = new Tire(size);
                }
                public void init() {
                    // 依赖轮胎
                    tire.init();
                }
            }
            /**
             * 轮胎类
             */
            static class Tire {
                // 尺⼨
                private int size;
                public Tire(int size) {
                    this.size = size;
                }
                public void init() {
                    System.out.println("轮胎尺⼨:" + size);
                }
            }
        }

       从(3)到(4) 的代码变换过程中可以看出: 当底层的业务逻辑改变之后, 相应的调用链上的代码全部都得修改.

(5)解决传统开发中的缺陷

       如何解决上面的问题?  我们可以尝试不在每个l类中创建下级类, 如果创建下级类, 就会出现, 下级类发生改变操作的时候, 自己也要跟着修改.

       此时, 我们只需要将原来由自己创建的下级类, 改为传递的方式, 因为我们不需要在当前类中创建下级类了, 此时即使下级类发生改变(增加或者减少函数的参数), 当前类本身也无序修改任何代码, 这样就完成了程序的解耦.

       关于解耦:  耦合也就是各个模块之间的关联程度, 关联程度越高, 其耦合就越大, 他们之间相互的影响就越大, 解耦就是指解决代码的耦合性, 好的代码的耦合性是很低的, 也就是代码之间简单地实现了解耦.  

       解耦就好比我们要打造一辆完整的汽车, 如果所有的配件都是自己造的, 那么当客户需求发生改变的时候, 比如轮胎的尺寸不是原来自己造出来的尺寸了, 就需要重新修改尺寸, 如果我们把轮胎外包出去, 那么即使是轮胎尺寸发生改变, 我们只需要向代理厂商下订单就可以了, 我们自身不需要花费力气去修改轮胎尺寸.

       基于上面的思想我们修改代码如下:

public class IocCarExample {
    public static void main(String[] args) {
        Tire tire = new Tire(20);
        Bottom bottom = new Bottom(tire);
        Framework framework = new Framework(bottom);
        Car car = new Car(framework);
        car.run();
    }
    static class Car {
        private Framework framework;
        public Car(Framework framework) {
            this.framework = framework;
        }
        public void run() {
            framework.init();
        }
    }
    static class Framework {
        private Bottom bottom;
        public Framework(Bottom bottom) {
            this.bottom = bottom;
        }
        public void init() {
            bottom.init();
        }
    }
    static class Bottom {
        private Tire tire;
        public Bottom(Tire tire) {
            this.tire = tire;
        }
        public void init() {
            tire.init();
        }
    }
    static class Tire {
        private int size;
        public Tire(int size) {
            this.size = size;
        }
        public void init() {
            System.out.println("轮胎:" + size);
        }
    }
}

       代码经过以上调整,⽆论底层类如何变化,整个调⽤链是不⽤做任何改变的,这样就完成了代码之间的解耦,从⽽实现了更加灵活、通⽤的程序设计了.

(6) 对比总结规律

  • 在传统的代码中对象创建顺序是:Car -> Framework -> Bottom -> Tire
  • 改进之后解耦的代码的对象创建顺序是:Tire -> Bottom -> Framework -> Car

       我们发现了⼀个规:通⽤程序的实现代码,类的创建顺序是反的,传统代码是 Car 控制并创建了Framework,Framework 创建并创建了 Bottom,依次往下,⽽改进之后的控制权发⽣的反转,不再是上级对象创建并控制下级对象了,⽽是下级对象把注⼊将当前对象中,下级的控制权不再由上级类控制了,这样即使下级类发⽣任何改变,当前类都是不受影响的,这就是典型的控制反转,也就是 IoC 的实现思想.

(7) 理解IOC

       回到我们的spring中, 我们刚开始就说过, Spring是包含了多个工具方法的IOC容器 , 这就是对spring的核心总结, 集成了多个工具方法的例子将会在后面的章节进行讲解, 那么我们下面来看看如何理解Spring是ioc容器这句话?

       既然spring是一个ioc容器, 那么我们的重点应该还放在容器二字上面, 也就是他具备两个功能:

  1. 将对象存入到容器
  2. 从容器中取出对象

       也就是说spring最核心的功能就是学习如何将一个对象存入到spring中去, 再从spring容器中取出的过程.

       我们可以类比生产工具的时候, 将对象存储在ioc容器也就相当于将以后所有可能用到的工具全部制作好放到仓库中, 用的时候直接取就行了, 用完再把他放回仓库, 而new对象的操作就相当于每次使用的时候现做, 用完就扔了也不会保存, 下次用的时候还得重新去做, 这就是ioc容器和普通程序开发的区别.

       Spring 是⼀个 IoC 容器,说的是对象的创建和销毁的权利都交给 Spring 来管理了,它本身⼜具备了存储对象和获取对象的能⼒.

目录
相关文章
|
19天前
|
数据采集 监控 前端开发
二级公立医院绩效考核系统源码,B/S架构,前后端分别基于Spring Boot和Avue框架
医院绩效管理系统通过与HIS系统的无缝对接,实现数据网络化采集、评价结果透明化管理及奖金分配自动化生成。系统涵盖科室和个人绩效考核、医疗质量考核、数据采集、绩效工资核算、收支核算、工作量统计、单项奖惩等功能,提升绩效评估的全面性、准确性和公正性。技术栈采用B/S架构,前后端分别基于Spring Boot和Avue框架。
|
1月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
42 4
|
1月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
143 1
|
28天前
|
Java API 数据库
Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐
本文通过在线图书管理系统案例,详细介绍如何使用Spring Boot构建RESTful API。从项目基础环境搭建、实体类与数据访问层定义,到业务逻辑实现和控制器编写,逐步展示了Spring Boot的简洁配置和强大功能。最后,通过Postman测试API,并介绍了如何添加安全性和异常处理,确保API的稳定性和安全性。
35 0
|
23天前
|
前端开发 Java 数据库连接
Spring 框架:Java 开发者的春天
Spring 框架是一个功能强大的开源框架,主要用于简化 Java 企业级应用的开发,由被称为“Spring 之父”的 Rod Johnson 于 2002 年提出并创立,并由Pivotal团队维护。
42 1
Spring 框架:Java 开发者的春天
|
9天前
|
前端开发 Java 开发者
Spring生态学习路径与源码深度探讨
【11月更文挑战第13天】Spring框架作为Java企业级开发中的核心框架,其丰富的生态系统和强大的功能吸引了无数开发者的关注。学习Spring生态不仅仅是掌握Spring Framework本身,更需要深入理解其周边组件和工具,以及源码的底层实现逻辑。本文将从Spring生态的学习路径入手,详细探讨如何系统地学习Spring,并深入解析各个重点的底层实现逻辑。
34 9
|
15天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,帮助开发者提高开发效率和应用的可维护性。
34 2
|
15天前
|
消息中间件 NoSQL Java
springboot整合常用中间件框架案例
该项目是Spring Boot集成整合案例,涵盖多种中间件的使用示例,每个案例项目使用最小依赖,便于直接应用到自己的项目中。包括MyBatis、Redis、MongoDB、MQ、ES等的整合示例。
65 1
|
23天前
|
Java 数据库连接 开发者
Spring 框架:Java 开发者的春天
【10月更文挑战第27天】Spring 框架由 Rod Johnson 在 2002 年创建,旨在解决 Java 企业级开发中的复杂性问题。它通过控制反转(IOC)和面向切面的编程(AOP)等核心机制,提供了轻量级的容器和丰富的功能,支持 Web 开发、数据访问等领域,显著提高了开发效率和应用的可维护性。Spring 拥有强大的社区支持和丰富的生态系统,是 Java 开发不可或缺的工具。
|
29天前
|
前端开发 Java 数据库
SpringBoot学习
【10月更文挑战第7天】Spring学习
34 9