学习spring: 1.引子

news2024/12/26 9:29:32

问题

我们来看一段代码:

package org.malred;

import org.malred.entity.Car;
import org.malred.entity.Tire;

/**
 * Hello world!
 *
 */
public class App {

  public static void main(String[] args) {
    Car car = new Car();
    Tire lt = new Tire();
    car.setLeftTire(lt);
    Tire rt = new Tire();
    car.setRightTire(rt);
    System.out.println("汽车组装完毕!");
    System.out.println(car);
  }
}

这里有两个类, 一个是Tire表示轮胎, 一个是Car表示汽车, 我们每次创建汽车, 都需要依赖于轮胎, 然后我们要一个一个地把轮胎组装(set)到车上.
现在汽车只有两个轮子, 如果有多个呢? 如果还需要电池、车门、车窗等依赖呢? 那就会导致我们的代码逻辑里, 多了很多这种组装的逻辑, 而忽略了主要逻辑, 增加很多冗余代码

解决方案: IoC容器

于是就出现了IoC容器这个解决方案, 通过一个外部的IoC Service Provider来帮我们管理对象的创建和依赖注入(set), 我们自己就不需要手动new和set, 只需要专注于业务逻辑
spring就是一款轻量级的框架, 为我们提供了一系列功能, 其中, spring core就包含IoC容器

体验IoC:

先体验, 了解一下Ioc的好处, 原理下一篇讲
新建maven项目, 使用引入spring core依赖

引入依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>5.3.24</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.3.24</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.24</version>
        </dependency>
    </dependencies>

项目结构

实体类

WheelingSystem.java
@Component
// 车轮系统
public class WheelingSystem {
    private Tire frontLeftTire;
    private Tire frontRightTire;
    private Tire backLeftTire;
    private Tire backRightTire;

    public WheelingSystem(Tire frontLeftTire, Tire frontRightTire, Tire backLeftTire, Tire backRightTire) {
        this.frontLeftTire = frontLeftTire;
        this.frontRightTire = frontRightTire;
        this.backLeftTire = backLeftTire;
        this.backRightTire = backRightTire;
    }

    @Override
    public String toString() {
        return "WheelingSystem{" +
                "frontLeftTire=" + frontLeftTire +
                ", frontRightTire=" + frontRightTire +
                ", backLeftTire=" + backLeftTire +
                ", backRightTire=" + backRightTire +
                '}';
    }
}
Tire.java
@Component
// 轮胎
public class Tire {
    @Override
    public String toString() {
        return "轮胎";
    }
}
Car.java
@Component
// 汽车
public class Car {
    private WheelingSystem ws;
    private Buttery buttery;

    public Car(WheelingSystem ws, Buttery buttery) {
        this.ws = ws;
        this.buttery = buttery;
    }

    @Override
    public String toString() {
        return "Car{" +
                "ws=" + ws +
                ", buttery=" + buttery +
                '}';
    }
}
Buttery.java
@Component
// 汽车电瓶
public class Buttery {
    @Override
    public String toString() {
        return "电瓶";
    }
}
可以看到, 我们给类加上了@Component注解, 接下来我们使用spring配置类进行扫描, 有这个注解的类会被识别并注册到IoC容器
而且我们提供了有参构造方法, IoC容器可以根据这些构造方法来了解依赖关系, 进行自动依赖注入

配置类

@Configuration//声明配置类
@ComponentScan(value = "org.malred")//配置自动扫描组件,双引号里配置要扫码的包
public class SpringIoCConfig {
}

spring 启动!

public class App {
    public static void main(String[] args) {
        // spirng工厂实例
        ApplicationContext context =
                new AnnotationConfigApplicationContext(SpringIoCConfig.class);
        // 获取IoC容器里Car类的实例
        Car car = context.getBean(Car.class);
        System.out.println(car);
    }
}

总结

使用IoC容器, 我们不需要再自己new和set, 而是标记需要用的对象(@Component)和对象间的依赖关系(这里的例子用构造方法来指明需要哪些依赖(类))
要用哪个对象直接取就行, 不用再一个一个new, 然后手动set

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/674436.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

状态估计器

文章目录 [toc] 1.状态空间模型1.1.连续状态空间模型1.2.离散状态空间模型 2.矩阵微积分3.二次规划4.概率论4.1.期望与方差4.2.独立事件4.3.向量随机变量4.4.噪声与协方差矩阵4.5.条件概率 5.最小二乘估计5.1.加权最小二乘估计5.2.递推最小二乘估计5.3.状态向量和协方差随时间变…

深入理解WebSocket,让你入门音视频

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。&#x1f60a; 座右铭&#xff1a;不想…

Android 使用okhttp监控网络数据

这里使用Okhttp写了一个demo来监听网络请求过程中的一系列数据&#xff0c;包括当前网络类型、请求体、响应体大小&#xff0c;url&#xff0c;请求方式&#xff0c;当然还有本次核心获取域名解析时长&#xff0c;建立连接时长&#xff0c;保持连接时长&#xff0c;请求总时长这…

《C++ Primer》--学习6

IO库 IO类 为了支持使用宽字符的语言&#xff0c;标准库定义了一组类型和对象来操纵 wchar_t 类型的数据。宽字符版本的类型和函数的名字以一个 w 开始。wcin wcout 和 wcerr 是分别对应 cin cout 和 cerr 的宽字符版本对象 IO类型之间的关系 类型 ifstream 和 istringstream…

Vuex 状态管理 —— 核心store

在上一篇当中讲到关于接口请求函数获取数据&#xff0c;拿到 response.data &#xff0c;简化调用&#xff0c;那么在拿到请求的响应数据之后呢&#xff1f;在前面讲到组件间的通信当中&#xff0c;如父子通信(父传子props,子传父$emit)以及组件与组件之前不能通过直接通信&…

【33】用 Docker 部署 Prometheus + Grafana 监控平台

一. Docker部署Prometheus 1.1 下载prom/prometheus镜像 docker pull prom/prometheus 1.2 启动prometheus容器 docker run -itd --nameprometheus -p 9090:9090 prom/prometheus 打开本地http://localhost:9090/ 说明启动成功 1.3 将容器的配置文件复制出来 docker cp pr…

深入理解深度学习——GPT(Generative Pre-Trained Transformer):在不同任务中使用GPT

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 GPT预训练语言模型作为一个标准的语言模型&#xff0c;其输入和输出是固定的&#xff0c;即输入一个词序列&#xff0c;输出该词序列的下一个词。《深入理解深度学习——GPT&#xff08;Generative Pre-Trained Transf…

GAMES101 笔记 Lecture06 Rasterization2(Antialiasing and Z-Buffering)

目录 Antialiasing(反走样)Sampling is Ubiquitous in Computer Graphics(采样在计算机图形学中无处不在)Sampling Artifacts(Errors or Mistakes or Inaccuracies) in Computer Graphics(在计算机图形学中采样的瑕疵)Jaggies(Staircase Pattern)锯齿Moire Pattern in Imaging(…

[进阶]TCP通信实现BS架构,网站开发的原理,线程池优化BS架构

代码演示如下&#xff1a; 服务端 public class Server {public static void main(String[] args) throws Exception{System.out.println("服务端开启&#xff01;");//1.创建ServerSocket的对象&#xff0c;同时为服务端注册端口。ServerSocket serverSocket new…

Wang tile(王浩瓷砖)算法解决贴图平铺重复问题

Wang tile(王浩瓷砖) 大家好&#xff0c;我是阿赵。这次来解决一个贴图重复的问题。 一、问题 做一篇很大面积的草地&#xff0c;一般思路是建立一个地面的面片&#xff0c;然后在材质球里面给他做一个Tiling平铺&#xff0c;增大重复次数。这样整个地面都可以被草地的贴图铺满…

Spring Boot 如何使用 @Validated 注解进行数据校验

Spring Boot 如何使用 Validated 注解进行数据校验 在开发应用程序时&#xff0c;数据校验通常是不可避免的。Spring Boot 提供了许多选项来验证应用程序中的数据&#xff0c;其中一个选项是使用 Validated 注解。本文将介绍如何使用 Validated 注解进行数据校验&#xff0c;并…

操作系统-操作系统结构

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

【计算机组成原理】Yy-z02硬布线模型机设计

目录 一、Yy-z02模型机的系统结构 二、Yy-z02模型机的数据通路 三、Yy-z02模型机的指令执行 四、Yy-z02模型机的硬布线控制器 一、Yy-z02模型机的系统结构 指令系统的实现 <--- 构造它的硬件系统 硬件系统构造过程&#xff1a; 分析指令格式和各指令的功能确定部件连…

《机器学习公式推导与代码实现》chapter16-集成学习对比与调参

《机器学习公式推导与代码实现》学习笔记&#xff0c;记录一下自己的学习过程&#xff0c;详细的内容请大家购买作者的书籍查阅。 集成学习&#xff1a;对比与调参 虽然现在深度学习大行其道&#xff0c;但以XGBoost、LightGBM、CatBoost为代表的Boosting算法仍有其广泛的用武…

【Applied Algebra】有限状态机和模型检测初探

【Applied Algebra】有限状态机和模型检测初探 摘要:有限状态机(FSM)和模型检测有密切的联系。有限状态机提供了一种用状态转换图来表示系统行为的简单方法。而模型检测是一种针对形式化模型&#xff08;例如有限状态机&#xff09;的验证技术&#xff0c;旨在自动验证模型是否…

css基础(一)

目录 思维导图 ​一、css简介 1.1 css语法规范 1.2 css代码规格 1. 样式格式书写 2. 样式大小写 3. 空格规范 二、css选择器 2.1 CSS 选择器的作用 2.2 选择器分类 2.3 标签选择器 2.4 类选择器 2.4 类选择器-多类名 2.5 id 选择器 2.6 通配符选择器 2.7 基础选择器总结 三、CS…

D. Running Miles(公式转换)

Problem - D - Codeforces 有一条长为n的街道&#xff0c;其中第i个景点距离街道起点i英里。第i个景点的美丽值为bi。你想要在离街道起点l英里和r英里处开始和结束慢跑。当你跑步时&#xff0c;你会看到你经过的景点&#xff08;包括起点和终点处的景点&#xff09;。你对沿途慢…

Microsoft365有用吗?2023最新版office有哪些新功能?

office自97版到现在已有20多年&#xff0c;一直是作为行业标准&#xff0c;格式和兼容性好&#xff0c;比较正式&#xff0c;适合商务使用。包含多个组件&#xff0c;除了常用的word、excel、ppt外&#xff0c;还有收发邮件的outlook、管理数据库的access、排版桌面的publisher…

CENTOS上的网络安全工具(二十五)SPARK+NetSA Security Tools容器化部署(1)

一、第三代YAF YAF&#xff08;Yet Another Flowmeter&#xff09;是作为CERT NetSA安全工具套件的传感器部分存在的&#xff0c;支持输入实时数据流和PCAP文件&#xff0c;解析并输出流数据&#xff0c;或针对特定协议的深包检测元数据。目前&#xff0c;YAF在整个系统的作用如…

【js30天挑战】第三天:css变量

效果图&#xff1a; 学到的东西 HTML&CSS部分 css变量写法 //定义:root{ //:root 是 CSS 选择器&#xff0c;它匹配文档的根元素&#xff0c;也就是 html 元素。 --base:#FF0081;--spacing:10px;--blur:0px;} //使用img {filter: blur(var(--blur));}input: range类型…