首页 > 其他分享 >认识Spring

认识Spring

时间:2024-01-10 17:58:19浏览次数:27  
标签:认识 Spring void class init static public size

什么是spring

我们常说的Spring是指Spring Framework,它是一种开源框架,它支持广泛的应用场景,可以令Java应用程序开发起来更简单。

用一句话来概括Spring:包含众多工具的 IoC 容器。

什么是 loC 

loC全称Inversion of Control,翻译成中文是“控制反转”,如何理解“控制反转”?我们举例说明,假设我们要实现建造一辆车的程序,传统的实现方式是:车依赖车身,车身依赖底盘,底盘依赖轮胎,如下是传统方式实现的代码:

public class CarExample {
    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);
        }
    }
}

 上述的代码中,固定了轮胎的尺寸为30,如果想要构建不同的尺寸的轮胎,就要修改代码,修改的代码如下:

public class CarExample {
    public static void main(String[] args) {
        Car car = new Car(40);
        car.init();
    }
    //汽车对象
    static class Car{
        private Framework framework;
        public Car(int size){
            framework = new Framework(size);
        }
       public void init(){
           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);
        }
    }
}

从修改后的代码来看,要想要不同尺寸的轮胎,就要从上到下的修改整个调用链上的代码,可以看出代码的耦合性非常高,那如何解决上述的问题呢?我们尝试不在自己了类中创建下级类,改为传递的方式,代码如下:

public class CarExample {
    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);
        }
    }
}

改为传递方式的代码不需要一层一层的调用下层的代码,只需要将下层的代码传递到(注入)当前类中,无论某一级的代码如何变化,其他的代码都可以保持不变,这样代码之间就形成了解耦。我们来对比一下两种方式的实现思路:

 传统的实现方式是当前类需要控制并创建下一级的对象,依次往下,而使用传递的方式是将下一级的对象注入到当前的对象中,不再是上一级类创建下一级类,下一级类也不受上一级类的控制,控制权发生了改变,即使下一级类如何变化,当前类都不会受到影响,这就是控制反转。

那么Spring也可以说是包含众多工具的控制反转的容器。

说到IoC就不得不说DI,DI 是 Dependency Injection 的缩写,翻译成中⽂是“依赖注 入”的意思。所谓依赖注入,就是由 IoC 容器在运行期间,动态地将某种依赖关系注入到对象之中。所以,依赖注入(DI)和控制反转(IoC)是从不同角度描述同⼀件事情,就是指通过引⼊ IoC 容 器,利⽤依赖关系注⼊的⽅式,实现对象之间的解耦。 IoC 是“⽬标”也是⼀种思想,目标和思想只是⼀种指导原则, 而DI 就属于具体的实现。

Spring既然是容器,那么它也就具备两种基础功能:既能存储也能拿取,那么Spring的核心就是如何将对象存储到容器中和如何从容器中去取出对象。将对象存入到容器中,需要用的时候直接取出来用,用完直接放回去,等到下次需要的时候再取出来用。

标签:认识,Spring,void,class,init,static,public,size
From: https://www.cnblogs.com/xbyss/p/17956687

相关文章

  • SpringBoot-Mybatis整合
     创建数据库CREATETABLE`user`( `id`int(11)NOTNULLAUTO_INCREMENTcomment'学号', `name`varchar(20)DEFAULTNULL, `pwd`int(11)DEFAULTNULL, PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=18DEFAULTCHARSET=utf8;创建一个springboo......
  • Springboot 扩展点
    1.ApplicationContextInitializerorg.springframework.context.ApplicationContextInitializer这是整个spring容器在刷新之前初始化ConfigurableApplicationContext的回调接口,简单来说,就是在容器刷新之前调用此类的initialize方法。这个点允许被用户自己扩展。用户可以在......
  • (token,Spring Security)
    认证:让服务器认识客户端之前使用session记录登录用户的信息,之后每次请求都验证session对象中是否有登录用户的信息(Filter)token认证:用户登录成功,服务端会给这个客户端(浏览器)签发一个token(字符串),客户端接收到这个token,存入到容器中(sessionStorage或者是LocalStorage),浏览器每次访......
  • SpringBoot中使用单例模式+ScheduledExecutorService实现异步多线程任务(若依源码学习
    场景若依前后端分离版手把手教你本地搭建环境并运行项目:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108465662设计模式-单例模式-饿汉式单例模式、懒汉式单例模式、静态内部类在Java中的使用示例:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/......
  • 重新认识Elasticsearch-一体化矢量搜索引擎
    前言2023哪个网络词最热?我投“生成式人工智能”一票。过去一年大家都在拥抱大模型,所有的行业都在做自己的大模型。就像冬日里不来件美拉德色系的服饰就会跟不上时代一样。这不前段时间接入JES,用上好久为碰的RestHighLevelClient包。心血来潮再次访问Elasticsearch官网,发现风格又变......
  • springboot学习日记(八)
    前后端分离的项目static目录下一般不存放东西。static目录下的图片等资源默认做了映射,直接在localhost:8080下访问即可。表单中的enctype属性决定了服务器对表单数据的编码,将该属性设置成form-data时可以通过filename找到路径,用content-type设置内容格式来上传文件。可使用Multi......
  • 重新认识Elasticsearch-一体化矢量搜索引擎
    前言2023哪个网络词最热?我投“生成式人工智能”一票。过去一年大家都在拥抱大模型,所有的行业都在做自己的大模型。就像冬日里不来件美拉德色系的服饰就会跟不上时代一样。这不前段时间接入JES,用上好久为碰的RestHighLevelClient包。心血来潮再次访问Elasticsearch官网,发现风格又......
  • Java Spring Boot Controller、Service、DAO实践
    如果你用过SpringMVC,那就对Controller、Service、DAO三者的概念一定不陌生,我们通过Controller来接收请求和返回响应,具体的业务处理则放在Service层处理,而DAO则实现具体与数据库等持久层的操作。今天从分层的角度来学习下在SpringBoot中的简单应用,业务场景也很简单,就......
  • Spring Cloud Hystrix
    在SpringCloud中使用了Hystrix来实现断路器的功能。Hystrix是Netflix开源的微服务框架套件之一,该框架目标在于通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。Hystrix具备拥有回退机制和断路器功能的线程和信号隔离,请求缓存和请求打包,以......
  • SpringBoot WebSocket 样例
    SpringBootWebSocket样例pom.xml依赖配置<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency><dependency><groupId>javax.webso......