Spring IoC和DI

目录

一. Spring是什么

IoC

DI

二. IoC&DI的使用

IoC

1.@Controller(控制器存储)

2.@Service(服务存储)

3.@Repository(仓库存储)

4.@Componemt(组件存储)

5.@Configuration(配置存储)

多种类注解的作用

6.@Bean(方法注解)

指定路径注解---@ComponentScan

bean的命名

1.五大注解存储的bean

2.@Bean注解储存

DI

1.属性注入

2.构造方法注入

3.Set方法注入

三种注入方式的优缺点

@Autowired存在问题的解决方式


一. Spring是什么

Spring是一个包含众多工具的IoC容器

容器:Tomcat--->web容器

            List/Map--->数据存储容器

Spring容器装的是对象。

IoC:控制反转

控制权反转,创建对象的控制权。

IoC

IoC的本质是为了解耦合。

举个例子:

建筑汽车时,汽车依赖车身,车身依赖底盘,底盘依赖轮胎。

car--->framework--->bottom--->tire

普通方式:

当想要遭不同轮胎尺寸的车辆时,修改轮胎类,把size设置为轮胎属性。于此同时要修改所有关联的类。

这种方式改动一个属性,需要需改所有关联的代码。

想要修改轮胎属性,而不影响其他的关联类,这个时候使用IoC的方式。

spring提供的IoC的思想:

每个类之间界限清晰,添加一个属性时其他的类关联性弱,Spring IoC需要做的就是管理对象,即实现下面Main方法的作用。

Spring帮助我们管理对象,我们需要做的事情:

1.告诉Spring,帮我们管理哪些对象

2.知道如何取出来这些对象

DI

IoC是一种思想,DI是一种实现方式。(注入依赖)

注入依赖,比如:上面的Car类中,把Framework注入Car中。

二. IoC&DI的使用

@Autowired:(英文:自动装配),用来注入依赖

@Componemt:(英文意为组件,即对象),用来存取对象

以之前的图书管理系统为例:

IoC

1.类注解:@Controller、 @Service、@Repository、@Componemt、@Configuration

2.方法注解:@Bean

1.@Controller(控制器存储)

用@Controller存储bean的代码

2.@Service(服务存储)

用@Service储bean的代码

getBean()提供的三种获取bean的方式

@SpringBootApplication
public class IoCDemoApplication {

	public static void main(String[] args) {
		//Spring上下文,返回Spring的运行环境
		ApplicationContext context=SpringApplication.run(IoCDemoApplication.class, args);
		//从context中获取bean
		UserController bean = context.getBean(UserController.class);
		bean.doController();

		UserService userService = context.getBean(UserService.class);
		userService.doService();

		//按照名称来获取bean
		UserService userService2 = (UserService)context.getBean("userService");
		userService2.doService();

		//根据名称和类型获取bean
		UserService userService3 = context.getBean("userService", UserService.class);
		userService3.doService();

	}

}

bean的命名约定:小写字母开头,采用驼峰命名。

特殊情况:如果类名的前两位都是大写,bean的名称不变

eg: UController------> "UController"

3.@Repository(仓库存储)

4.@Componemt(组件存储)

5.@Configuration(配置存储)

多种类注解的作用

这些类注解的用法相似,有这么多的类注解的目的是为了更好的应用分层,根据不同的类注解能直接了解当前类的用途。

@Controller(控制层)、 @Service(业务逻辑层)、@Repository(数据访问层)、@Configuration(配置层)

注解之间的关系

@Controller、 @Service、@Repository都是@Componemt的衍生类,即@Componemt是他们的父类

若想让外界访问到,程序的入口只能使用@Controller

6.@Bean(方法注解)

1.上述五大注解只能加在类上,并且只能加在自己的代码上,当想要引入一个第三方jar包,也希望交给Spring管理

2.当对于一个类想要定义多个对象时,无法用上述五大注解完成。

这两种情况需可以使用@Bean方法注解

使用

1.@Bean必须搭配五大注解使用

2.使用@Bean注解时,一个类型存在多个bean时,不能使用类型获取对象,使用bean的名称获取对象,bean的名称是方法名

@Bean传递参数

如果需要的Bean的类型对应的对象只有一个时,就直接赋值。如果有多个时通过名称来匹配。

指定路径注解---@ComponentScan

SpringBoot的特点:约定大于配置

springBoot默认扫描路径是启动类所在的目录及子孙目录

比如:启动类的代码、位置大于我们自己的代码

启动类在哪里就只扫描哪个路径下的文件内容

使用@ComponentScan指定路径

bean的命名

1.五大注解存储的bean

1.前两位名称全为大写,bean名称为类名

2.其他的为类名首字母小写

3.通过value设置属性,@Controller(value=xxx")

2.@Bean注解储存

1.bean名称为方法名

2.通过name属性设置@Bean(name="aaa ","bbb")

DI

对依赖对象的注入,也被叫做“属性装配”、“依赖装配”。

1.属性注入

使用@Autowired

2.构造方法注入

存在无参的构造函数和有参的构造函数时,不加注释会默认使用无参的构造函数

如果存在多个构造函数时,需要加上@Autowired注明使用哪个构造函数

如果只有一个构造函数,@Autowired可以省略掉

3.Set方法注入

三种注入方式的优缺点

1.属性注入

优点:简洁、使用方便

缺点:只能使用IoC容器、不能注入final修饰的属性

2.构造函数注入

优点:可注入final修饰的属性、注入的对象不会被修改;依赖对象在使用前一定会被初始化,因为依赖是在类的构造方法中执行的,而构造方法是在类加载阶段就会执行;通用性好,构造方法是JDK支持的,所以更换任何框架都是试用的。

缺点:注入多个对象时,代码会比较繁琐。

3.Set方法注入

优点:方便实例后,重新对对象进行配置或注入。

缺点:注入对象可能会被改变,因为Setter方法可能会被多次调用,就有被修改的风险;不能注入一个final修饰的属性。

@Autowired存在问题的解决方式

当程序中一个类型有多个对象时,使用@Autowired会报错

解决方式:

1.属性名和需要使用的对象名保持一致

2.使用@Primary注解标识默认的对象

3.使用@Qualifier

指定要使用的属性

4.使用@Resource注解

使用@Autowired和使用@Resource的区别

1.@Autowired是Spring框架提供的,@Resource是JDK提供的

2.@Autowired默认按照类型注入,如果一个类型存在多个对象,按名称匹配不上,就会报错。而@Resource按照名称注入,相比之下@Resource支持更多的参数设置

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

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

相关文章

电机:有刷直流电机的原理

一、什么是有刷直流电机 直流有刷电机(Brushed DC Motor),定子是用永磁铁或者线圈做成,以形成固定磁场。在定子一端上有固定碳刷,或者铜刷,负责把外部电流引入转子线圈。而转子是由线圈构成,线…

散列卡片悬停变为整齐列表

效果展示 CSS 知识点 transform 属性运用 页面整体布局 <ul><li><div class"box"><img src"./user1.jpg" /><div class"content"><h4>Hamidah</h4><p>commented on your photo.<br />…

036.Python面向对象_self_cls_super

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

了解一下分治算法

文章目录 分治算法 分治算法 分治算法基本介绍 分治法&#xff08;Divide-and-Conquer&#xff09;是一种很重要的算法。字面上的解释是"分而治之"&#xff0c;就是把一个复杂的问题分成两个或更多的相同或相似的子问题&#xff0c;再把子问题分成更小的子问题……直…

vue2 cron表达式组件

vue2 cron表达式组件 1. 先上图 2. 代码目录 3. 直接上代码 &#xff08;组件代码太多&#xff0c;直接上压缩包&#xff0c;解压后直接用&#xff0c;压缩包再博客顶部&#xff09; 4. 使用注&#xff1a;示例代码中使用了element-ui // HomeView.vue<template><…

ubuntu16.04升级openssl

Ubuntu16.04 默认带的openssl版本为1.0.2 查看&#xff1a;openssl version 1.下载openssl wget https://www.openssl.org/source/openssl-1.1.1.tar.gz 编译安装 tar xvf openssl-1.1.1.tar.gz cd openssl-1.1.1 ./config make sudo make install sudo ldconfig 删除旧版本 su…

UDP 协议

UDP协议 1.UDP的基本特点2.UDP协议格式 1.UDP的基本特点 无连接:知道源端口号和目的端口号就可以进行传输,不需要进行连接不可靠:没有任何的安全机制,发送端发送完数据后,接收端是否会因为网络故障等其原因而没有接收到数据,UDP协议不会返回任何信息给应用层.面向数据报:应用层…

1、初识 llvm源码编译 及virtualbox和ubuntu环境搭建

很久没更新了&#xff0c;最近准备研究逆向和加固&#xff0c;于是跟着看雪hanbing老师学习彻底搞懂ollvm&#xff0c;终于把所有流程跑通了&#xff0c;中间遇到了太多的坑&#xff0c;所以必须记录一下&#xff0c;能避免自己和帮助他人最好。 环境搭建太重要了&#xff0c;…

软件测试相关

软件测试是什么&#xff1f; 使用人工和自动手段来运行或测试某个系统的过程&#xff0c;其目的在于验证它是否满足规定的需求或弄清预期结果与实际结果的差别。 为什么做软件测试&#xff1f;目的是什么&#xff1f; 发现软件存在的代码或业务逻辑错误 检验产品是否符合用户需…

基于ssm化妆品配方及工艺管理系统的设计与实现论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本化妆品配方及工艺管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的…

基于SSM的点餐系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

【开源】基于JAVA的个人健康管理系统

项目编号&#xff1a; S 040 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S040&#xff0c;文末获取源码。} 项目编号&#xff1a;S040&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 健康档案模块2.2 体检档案模块2.3 健…

Aho Corasick Algorithm

文章目录 前言介绍实现参考 前言 Aho Corasick Algorithm又叫AC自动机&#xff0c;该算法是一个匹配算法&#xff0c;用来匹配文本Text中多个patterns分别出现的次数&#xff1b; 我们定义n为patterns的总长度&#xff1b;m为Text的长度&#xff1b; 问题&#xff1a;在ahis…

uniapp实战 —— 可滚动区域 scroll-view (自适配高度,下拉刷新)

自适配高度 自定义的顶部导航栏&#xff0c;可参考博文 https://blog.csdn.net/weixin_41192489/article/details/134852124 如图可见&#xff0c;在页面滚动过程中&#xff0c;顶部导航栏和底栏未动&#xff0c;仅中间的内容区域可滚动。 整个页面的高度设置为 100%&#xf…

基于以太坊的智能合约开发Solidity(事件日志篇)

//声明版本号&#xff08;程序中的版本号要和编译器版本号一致&#xff09; pragma solidity ^0.5.17; //合约 contract EventTest {//状态变量uint public Variable;//构造函数constructor() public{Variable 100;}event ValueChanged(uint newValue); //事件声明event Log(…

深度学习 | Pytorch深度学习实践 (Chapter 12 Basic RNN)

十二、Basic RNN —— 实际上就是对线性层的复用 使用RNN最重要的两点&#xff1a; 了解序列数据的维度&#xff1b;循环过程所用的权重共享机制&#xff1b; 一般就是自己写个循环&#xff0c;权重层重复用就行了&#xff1b; 回顾&#xff1a;-----------------------------…

09--面向对象OOP--04

1、关键字&#xff1a;static 1.1 什么是static关键字 它可以用来修饰的成员变量和成员方法&#xff0c;被修饰的成员是属于类的&#xff0c;而不是单单是属 于某个对象的。也就是说&#xff0c;既然属于类&#xff0c;就可以不靠创建对象来调用了。 使用范围&#xff1a; 在…

高级Linux监控堡垒机学习指南

高级Linux监控堡垒机学习指南 在现代复杂的网络环境中&#xff0c;安全性和监控是系统管理的核心关注点。Linux监控堡垒机作为一种安全管理工具&#xff0c;不仅可以追踪系统活动&#xff0c;还能提供对服务器和网络资源的高级监控。本文将深入探讨高级Linux监控堡垒机的学习内…

Grafana系列-Loki-基于日志实现告警

系列文章 Loki 系列文章 前言 实际应用中除了基于 Metrics 告警, 往往还有基于日志的告警需求, 可以作为基于 Metrics 告警之外的一个补充. 典型如基于 NGINX 日志的错误率告警.本文将介绍如何基于 Loki 实现基于日志的告警. 本文我们基于以下 2 类实际场景进行实战演练: …

【Java实现百钱买百鸡的两种写法】

Java实现百钱买百鸡的两种写法 Java双重嵌套for循环实现百钱买百鸡的写法&#xff08;一&#xff09;Java三重嵌套for循环实现百钱买百鸡的写法&#xff08;二&#xff09; Java双重嵌套for循环实现百钱买百鸡的写法&#xff08;一&#xff09; //定义一个记录循环次数变量int …