• Servlet 与Spring对比!


    前言:

    Spring相关的框架知识,算是目前公司在用的前沿知识了,很重要!!

    那么以Spring为基础的框架有几个?

    以Spring为基础的框架包括若干模块,其中主要的有Spring Framework、Spring Boot、Spring Cloud等。

    1. Spring Framework:这是最基础的Spring框架,它包括了ioc依赖注入,Context上下文、bean管理等功能模块。Spring框架的主要目的就是简化Java后端开发工作,它由20个左右不同的模块组成,这些模块分别是Test、Core Container(核心容器)、Data Access/Integration(数据访问/集成)、Web、AOP/Aspect(应用对象解耦)、Instrumentation和Messaging(检测消息)。
    2. Spring Boot:这个框架的目标是简化Spring应用和服务的创建、开发与部署,比如它可以简化配置文件,使用嵌入式web服务器,含有诸多开箱即用的微服务功能。
    3. Spring Cloud:它是一系列框架的集合,主要用于构建分布式系统,提供配置管理、服务发现、断路器、智能路由、微代理、控制总线等功能。

      在使用这些框架时,可以根据具体的需求来选择性地使用所需要的模块,以满足企业级应用开发的需求。

    相比于Spring Framework和Spring Cloud而言,小编主要着重于Spring Boot框架相关的知识来进行讲解的!当然,Spring Boot也算是很常见的框架之一了!

    Servlet痛点分析:

    1. 添加外部jar不方便,容易出错(比如:添加了一个不匹配的外部jar版本)
    2. 运行和调试的时候,需要配置tomcat,不方便
    3. 发布不方便,Servlet项目必须依靠外置的tomcat(外置的Web容器运行)
    4. 路由配置不方便,一个访问地址对应一个Servlet类!
    5. …………………………

    Spring基础与核心概念:

    官网:spring.io

    一句话概述Spring:包含了众多工具方法的Ioc容器

    那么,什么是容器??

    容器是用来容纳某种物品的(基本)装置(如:水杯)

    那么,我们之前课程所接触到的容器有哪些??

    • List / Map《——》数据存储容器
    • tomcat《——》Web容器
    • ……………………

    Ioc:全文为:Inversion of Control(汉语意思为:控制反转)实际意义为:控制(权)反转

    那么,也就是说:Spring是一个“控制反转”的容器!

    A对象掌握B对象的控制权(实列化),但由于B对象参数等的改变,导致A对象如何控制B对象也会发生相应的变化,为解决这一问题,将B对象给第三方,此时,A对象对B对象的控制权转移/交接给第三方,这就是控制(权)反转!!

    当最底层发生变化时,整个调用链都需要修改——》耦合!(耦合:两个/两个以上的对象,相互依赖)

    接下来,我们来通过传统的解法来构造一个“车”吧!!

    接下来,我们来看一下相关的代码吧:

    车轮胎:

    1. public class Tire {
    2. //车轮胎
    3. public int size=17;//车身尺寸
    4. public Tire (int size){
    5. this.size=size;
    6. }
    7. public void init(){
    8. System.out.println("size -->" +size);
    9. }
    10. }

    底盘:

    1. public class Bottom {
    2. //底盘
    3. private Tire tire;
    4. public Bottom(int size) {
    5. tire=new Tire(size);
    6. }
    7. public void init(){
    8. System.out.println("do bottom");
    9. tire.init();
    10. }
    11. }

    车身:

    1. public class Framework {
    2. //车身
    3. private Bottom bottom;
    4. public Framework(int size){
    5. bottom=new Bottom(size);
    6. }
    7. public void init(){
    8. System.out.println("do bottom");
    9. bottom.init();
    10. }
    11. }

    车:

    1. public class Car {
    2. //车
    3. private Framework framework;
    4. public Car(int size){
    5. framework=new Framework(size);
    6. }
    7. public void init(){
    8. System.out.println("do Car");
    9. framework.init();
    10. }
    11. public static void main(String[] args) {
    12. Car car=new Car((20));
    13. car.init();
    14. }
    15. }

    上述代码的运行结果为:

    但是,对于上述的代码,当我们对其增加一个属性:color颜色的时候,其相关代码就会发生大幅度的改变!其耦合性太高!因此,我们需要对其解耦操作:Ioc高级写法:

    更改后的代码为:

    车轮胎:

    1. public class Tire2 {
    2. //车轮胎
    3. public int size=17;//车身尺寸
    4. private String color="红色";
    5. public Tire2(int size, String color) {
    6. this.size = size;
    7. this.color = color;
    8. }
    9. public void init(){
    10. System.out.println("size -->" +size + "color -->"+color);
    11. }
    12. }

    底盘:

    1. public class Bottom2 {
    2. //底盘
    3. private Tire2 tire2;
    4. public Bottom2(Tire2 tire2) {
    5. this.tire2=tire2;
    6. }
    7. public void init(){
    8. System.out.println("do bottom2~~");
    9. tire2.init();
    10. }
    11. }

    车身:

    1. public class Framework2 {
    2. //车身
    3. private Bottom2 bottom2;
    4. public Framework2(Bottom2 bottom) {
    5. this.bottom2 = bottom;
    6. }
    7. public void init(){
    8. System.out.println("do framework2~~");
    9. bottom2.init();
    10. }
    11. }

    车:

    1. public class Car2 {
    2. //车
    3. private Framework2 framework2;
    4. public Car2(Framework2 framework2){
    5. this.framework2=framework2;
    6. }
    7. public void init(){
    8. System.out.println("do Car2~~~");
    9. framework2.init();
    10. }
    11. }

    测试类:

    1. public class Test {
    2. //测试类
    3. public static void main(String[] args) {
    4. Tire2 tire2=new Tire2(20,"黑色");
    5. Bottom2 bottom2=new Bottom2(tire2);
    6. Framework2 framework2=new Framework2(bottom2);
    7. Car2 car2=new Car2(framework2);
    8. car2.init();
    9. }
    10. }

    那么,上述代码的运行结果为:

    那么,经过上述的代码,我们可以看出:

    Ioc不是一个具体的技术,它是一个思想(控制权转移)!

    Ioc最比较重要的功能:解耦

    既然Spring是一个Ioc(控制反转)容器,重点还在“容器”二字上,那么,它就具有两个最基础的功能:

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

    上面两个是Spring Ioc最核心(基础)操作!!


    Spring是一个Ioc容器,说的是对象的创建和销毁的权利都交给Spring来管理了,它本身具备了存储对象和获取对象的能力!

    那么,我们来看一下:Spring Ioc的优点:

    1. 解耦
    2. 使用更加方便(不需要手动创建和关注这个对象背后的依赖关系)
    3. 更加高效

    那么,我们来浅浅了解一下DI吧!!

    其实,在刚刚接触到DI的时候,小编也是一脸迷茫,但是,经过短暂的学习,发现DI还是挺靠谱的!

    Ioc《——》DI,相对于一对CP

    DI是 Dependency  Injection(依赖注入)的缩写

    所谓的依赖注入就是由Ioc容器在运行期间,动态的将某种依赖关系注入到对象之中,所以,依赖注入(DI)和控制反转(Ioc)是从不同的角度描述同一件事情,就是指:通过引入Ioc容器,利用依赖关系注入的方式,实现对象之间的解耦!

    其实,说白了,依赖注入:将依赖的某个对象注入到当前类中的这个行为,就叫做依赖注入!

    Ioc是一种思想,而DI是一种具体的实现技术!

    如:今儿心情好,吃顿好的犒劳犒劳自己!则“吃顿好的”是思想和目标(Ioc),但是,最后是吃海底捞还是吃杨国富??这就是具体的实现,这就是DI

    那么,我们可以看出:

    1. Ioc:思想
    2. Spring  Ioc:框架
    3. DI:技术
  • 相关阅读:
    项目沟通管理
    AI少女 升级包
    js中遍历数组的方法总结,以及数组中常用方法总结
    Zookeeper-3.8.0集群搭建
    uniapp中scroll-view初始化的时候 无法横向滚动到某个为止
    分布式系统的知识点-架构设计
    实体属性映射框架mapstruct
    PHP中的面向对象编程
    基于极限学习机 (ELM) 进行正弦波预测(Matlab代码实现)
    算法通过村第九关-二分(中序遍历)黄金笔记|二叉搜索树
  • 原文地址:https://blog.csdn.net/weixin_64308540/article/details/134044570