【学习】Spring IoCDI

  • 🎥 个人主页:Dikz12
  • 📕格言:吾愚多不敏,而愿加学
  • 欢迎大家👍点赞✍评论⭐收藏

目录

Spring 是什么?

什么是 IoC容器?

传统开发模式 

loC开发模式

IoC的优势 

IoC 的使用

Bean的存储 

 方法注解

 DI

 属性注入

 构造⽅法注⼊

 Setter 注⼊

@Autowired存在的问题

 解决方案:

 @Autowired和@Resource的区别


Spring 是什么?

 Spring是一个开发应用框架,其目的是用于简化企业级应用程序开发. Springd的原生框架指的是Spring Core、Spring FrameWork; 这个概念是比较抽象的,可以用一句更具体的话来概述:Spring是包含众多工具的 IoC容器.

什么是 IoC容器?

“容器”通常指的是一种可以用来盛放物品的器皿;⽣活中的⽔杯,垃圾桶,冰箱等等这些都是容器,像 List/ Map就是数据存储的容器、Tomcat 就是Web容器;

IoC:Inversion of Control (控制反转),也是Spring两大核心思想之一. 也就是说: Spring是⼀个"控制反转"的容器.

什么是控制反转?

也就是控制权反转,获取依赖对象的过程被反转了,当需要 某个对象时,传统开发模式中需要自己通过new创建对象,现在不需要在进行创建,而是把这个创建对象的任务交给了容器. 程序只需要依赖注入(DI)就可以. 这个容器就是IoC容器.

IoC是一种思想,在生活中也有体现:

比如:传统的驾驶方式,车辆的控制权需要由驾驶员来控制,而现在就可以把驾驶权交给自动化系统来控制。

IoC是一种思想,DI是一种实现方式!

传统开发模式 

 设计轮⼦(Tire),然后根据轮⼦的⼤⼩设计底盘(Bottom),接着根据底盘设计⻋⾝(Framework),最后根据⻋⾝设计好整个汽⻋(Car)。这⾥就出现了⼀个"依赖"关系:汽⻋依赖⻋⾝,⻋⾝依赖底盘,底盘依赖轮⼦.

public class Main {
    public static void main(String[] args) {
        Car car = new Car(17);
        car.run();
    }
}

static class FrameWork {
    private Bottom bottom;

    public FrameWork(int size) {
        bottom = new Bottom(size);
    }
}

static class Bottom {
    private Tire tire;

    public Bottom(int size) {
        tire = new Tire(size);
        System.out.println("Bottom...init..");
    }
}

static class Tire {
    public int size;
    private String color;

    public Tire(int size) {
        this.size = size;
        System.out.println("tire....init...size:"+size);
    }
}

 从以上代码可以看出,以上程序的问题是:当最底层代码改动之后,整个调⽤链上的所有代码都需要修改.程序的耦合度⾮常⾼(修改⼀处代码,影响其他处的代码修改)

loC开发模式

把调⽤汽⻋的程序⽰例改造⼀下,把创建⼦类的⽅式,改为注⼊传递的⽅式.
 

public class Main {
    public static void main(String[] args) {
        Tire tire= new Tire(17,"red");
        Bottom bottom = new Bottom(tire);
        Framework framework = new Framework(bottom);
        Car car = new Car(framework);
        car.run();
    }
}

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

IoC的优势 

  1. 资源集中管理,实现资源的可配置和易管理。
  2. 降低了使⽤资源双⽅的依赖程度,也就是我们说的耦合度(解耦)。

IoC 的使用

Bean的存储 

 共有两类注解类型可以实现:

  • 1. 类注解:@Controller、@Service、@Repository、@Component、@Configuration.
  • 2. ⽅法注解:@Bean.
@Controller //把这个对象交给Spring进行管理
public class UserController {
    public void hello() {
        System.out.println("Hello,Controller");
    }
}

 获取对象:

    public static void main(String[] args) {
      ApplicationContext context = SpringApplication.run(IocDemoApplication.class, args);
      //从Spring上下⽂中获取对象
        UserController userController = context.getBean(UserController.class);
        userController.hello();
    }

  • @Controller:控制层,接收请求,对请求进⾏处理,并进⾏响应.
  • @Servie:业务逻辑层,处理具体的业务逻辑.
  • @Repository:数据访问层,也称为持久层.负责数据访问操作
  • @Component :组件存储.
  • @Configuration:配置层.处理项⽬中的⼀些配置信息

 方法注解

类注解是添加到某个类上的,但是存在两个问题:

  • 1. 使⽤外部包⾥的类,没办法添加类注解
  • 2. ⼀个类,需要多个对象,⽐如多个数据源

这种场景,我们就需要使⽤⽅法注解@Bean.

@Configuration
public class BeanConfig {
    @Bean("u1")
    public User user1() {
        User user = new User();
        user.setName("zhangsan");
        user.setAge(18);
        return user;
    }
}

@Bean 方法注解要搭配类注解一起使用,否则就是报错!! 可以对Bean对象进行重命名操作.

 DI

 依赖注⼊是⼀个过程,是指IoC容器在创建Bean时,去提供运⾏时所依赖的资源,⽽资源指的就是对象.

关于依赖注⼊,Spring也给我们提供了三种⽅式:

  • 1. 属性注⼊
  • 2. 构造⽅法注⼊
  • 3. Setter注⼊

 属性注入

 属性注⼊是使⽤@Autowired注解实现的. 比如:将Service 类注⼊到 Controller类中.

@Controller //把这个对象交给Spring进行管理
public class UserController {
    @Autowired
    private UserService userService;
    public void hello() {
        System.out.println("Hello,Controller");
        userService.hello();
    }
}
@Service
public class UserService {
    public void hello() {
        System.out.println("Hello,UserService...");
    }
}

 构造⽅法注⼊

@Controller
public class UserController2 {
    //注⼊⽅法2: 构造⽅法
    private UserService userService;

    public UserController2() {

    }
    @Autowired
    public UserController2(UserService userService) {
        this.userService = userService;
    }
    public void hi(){
        System.out.println("hi,UserController2...");
        userService.hello();
    }
}

去掉@Autowired,就会报异常,如下:

 如果类只有⼀个构造⽅法,那么,@Autowired注解可以省略;如果类中有多个构造⽅法,那么需要添加上@Autowired来明确指定到底使⽤哪个构造⽅法。

 Setter 注⼊

@Controller
public class UserController3 {
    //注⼊⽅法3: Setter⽅法注⼊
    private UserService userService;

    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
    public void hello() {
        System.out.println("hello,UserController3...");
        userService.hello();
    }
}

如果去掉@Autowired的话,就会报空指针异常!

@Autowired存在的问题

 当同⼀类型存在多个bean时,使⽤@Autowired会存在问题.

 

会出两个bean对象,非唯一的bean对象,Spring就不知道要用那个了,直接就启动失败! 

 解决方案:

1.修改@Autowired的属性名跟Bean的名称一致.

 

 2.使⽤@Primary注解:当存在多个相同类型的Bean注⼊时,加上@Primary注解,来确定默认的实现.

3. 使⽤@Qualifier注解:指定当前要注⼊的bean对象。在@Qualifier的value属性中,指定注⼊的bean的名称。 @Qualifier注解不能单独使⽤,必须配合@Autowired使⽤.

 4.使⽤@Resource注解:是按照bean的名称进⾏注⼊。通过name属性指定要注⼊的bean的名称。

 @Autowired和@Resource的区别

  1.  @Autowired默认是以类型注入的,当同一个类型有多个对象,也会按名称进行匹配,如果名称匹配不到,就会报错;@Resource 是按照名称注入的,使用name指定注入。
  2. @Autowired是由Spring提供的注解;@Resource是JDK提供的注解。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

TMS320F280049 EPWM模块--ET子模块(7)

下图是ET子模块在EPWM中的位置。可以看到ET子模块相对较独立。接收多种信号,处理后传递给PIE和ADC。 下图是ET的内部框图,可以更具体的看到输入和输出信号。 ET内部也可以软件force产生事件信号。ET输出时可以做分频,也就是接收n次输入后才输…

外贸开发信必知技巧:高回复率不再是梦

外贸行业在Zoho的客户群体中占比较高。因为我们的国际化背景、丰富的产品组合、多语言多币种跨时区、高性价比等特点,成为外贸企业开展业务的选择。在和外贸客户沟通中,发现无论是外贸大拿还是新手小白,大家遇到一个共同的问题——发出去的开…

5252DG 外场通信测试仪范围:9kHz~6.3GHz/9GHz/20GHz

5252DG 外场通信测试仪 率范围:9kHz~6.3GHz/9GHz/20GHz 简述 5252DG外场通信测试仪是集合高性能信号分析模块、多制式解析算法软件于一体的手持式测试仪表,是为满足运营商对移动通信的测试而推出的全新平台。其拥有更高测试频率、更大解析带宽、更快扫…

单例19c RMAN数据迁移方案

一、环境说明 源库 目标库 IP 192.168.37.200 192.168.37.202 系统版本 RedHat 7.9 RedHat 7.9 数据库版本 19.3.0.0.0 19.3.0.0.0 SID beg beg hostname beg rman 数据量 1353M 说明:源库已经创建数据库实例,并且存在用户kk和他创建的表空间…

内存地产风云录:malloc、free、calloc、realloc演绎动态内存世界的楼盘开发与交易大戏

欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 C语言知识 先赞后看,已成习惯 创作不易,多多支持! 在这个波澜壮阔的内存地产世界中,malloc、free、calloc和realloc四位主角,共同演绎着一场场精彩绝伦的楼盘开…

绿联 安装SeaTable在线协同表格

绿联 安装SeaTable在线协同表格 SeaTable 是一款以在线协同表格为基础的新型企业数字化平台。它支持“文件”、“图片”、“单选项”、“协作人”、“计算公式”等丰富的数据类型,帮助你用表格的形式来方便的组织和管理各类信息。在表格基础上,它支持自…

MySQL相关问题快问快答

我写这篇文章的目的只有一个:通过这些问题来帮助我去将我脑子里的MySQL脑图给巩固熟悉,通过回答这些问题,让我对脑子里的MySQL知识有更深的印象,当什么时候我的MySQL脑图不熟的时候,我就可以拿这篇文章来去巩固一下&am…

构建第一个ArkTS之基本语法概述

在初步了解了ArkTS语言之后,我们以一个具体的示例来说明ArkTS的基本组成。如下图所示,当开发者点击按钮时,文本内容从“Hello World”变为“Hello ArkUI”。 图1 示例效果图 本示例中,ArkTS的基本组成如下所示。 图2 ArkTS的基本…

[大模型]Qwen1.5-4B-Chat WebDemo 部署

Qwen1.5-4B-Chat WebDemo 部署 Qwen1.5 介绍 Qwen1.5 是 Qwen2 的测试版,Qwen1.5 是基于 transformer 的 decoder-only 语言模型,已在大量数据上进行了预训练。与之前发布的 Qwen 相比,Qwen1.5 的改进包括 6 种模型大小,包括 0.…

回溯算法2s总结

8.回溯算法 回溯算法理论基础 回溯法也可以叫做回溯搜索法,它是一种搜索的方式。回溯是递归的副产品,只要有递归就会有回溯。 回溯的本质是穷举,穷举所有可能,然后选出我们想要的答案 回溯法解决的问题 回溯法,一…

买随身WiFi快存好❗随身WiFi真的靠谱吗?随身WiFi推荐测评!随身WiFi哪个牌子靠谱?

选购随身WiFi避免众多波折,这篇随身WiFi购买指南,务请珍藏于心, 以备不时之需!选购随身WiFi的三大避坑指南:1、基站信号稳为先:选择前务必细查所在地基站信 号,确保网络畅通无阻。 2、正规认证…

必应bing搜索广告推广国内能开户吗?

随着互联网广告市场的不断进化和细分化,必应Bing搜索广告已逐渐成为中国企业拓展国内市场、精准触达目标客户的重要渠道之一。2024年,必应Bing在国内市场的进一步布局,不仅彰显了其对本土企业的强大吸引力,更带来了全新的开户政策…

Go——面向对象

一. 匿名字段 go支持只提供类型而不写字段名的方式,也就是匿名字段,也称为嵌入字段。 同名字段的情况 所以自定义类型和内置类型都可以作为匿名字段使用 指针类型匿名字段 二.接口 接口定义了一个对象的行为规范,但是定义规范不实现&#xff…

利用免费AI开源引擎:实现图像识别技术在多主体检测中的应用|识别万物|本地化部署

在当今快速发展的图像处理领域,图像主体检测技术已成为提升图像分析效率和精度的关键工具。该技术能够自动识别和定位图像中的一个或多个主要对象,并提供其具体的位置坐标和分类标签。这不仅为图像编辑和优化提供了便利,也为后续的图像识别任…

C-开发 visual Studio扩展插件介绍-格式化插件Xaml Styler、CSharpier介绍(扩展插件安装方法)

C#开发 visual Studio扩展插件介绍 扩展插件安装方法Xaml StylerCSharpier 提高C#开发效率常用的插件 扩展插件安装方法 菜单栏点击“扩展”→“管理扩展”。 打开扩展页面 右上角搜索需要安装的插件,然后点击下载 安装完成后,根据提示关闭VS进行安…

selenium绕过网站检测的方法

使用selenium打开如下网站,进行检测,代码如下: from selenium import webdriver import timedriver webdriver.Chrome() driver.get(https://bot.sannysoft.com/) time.sleep(60)发现webdriver被检测到了 在这里可使用一个selenium提供的插…

【MATLAB源码-第7期】基于matlab的8PSK的实际误码率BER和理论误码率BER对比仿真。

1、算法描述 8PSK (8 Phase Shift Keying 8移相键控) 是一种相位调制算法。相位调制(调相)是频率调制(调频)的一种演变,载波的相位被调整用于把数字信息的比特编码到每一次相位改变(相移)。&quo…

是时候将 DevOps 可见性扩展到网络边缘了

尽管部署前运行了大量测试,但在部署应用程序后,性能问题经常让 DevOps 团队感到困惑。经过进一步调查,最常被忽视的问题是应用程序本身的分布式特性。从多个位置访问应用程序的最终用户永远不会拥有相同水平的互联网服务,因此在纽…

让大模型落地有“技”可循

“2018年,随着Transformer预训练模型的兴起,自然语言处理(NLP)学术圈中形成了一个主流观点——NLP领域的不同技术方向,如文本分类、文本匹配、序列标注等,最终都会被归结到文本生成这一核心任务之下。”这是…

【大语言模型】基础:如何处理文章,向量化与BoW

词袋模型(BoW)是自然语言处理(NLP)和机器学习中一种简单而广泛使用的文本表示方法。它将文本文档转换为数值特征向量,使得可以对文本数据执行数学和统计操作。词袋模型将文本视为无序的单词集合(或“袋”&a…