IoC和DI

Spring 是包含众多工具的 IoC 容器,存的是对象,对象这个词在 Spring 的范围内,称之为 bean

IoC 是控制反转

控制权进行了反转,比如对某一个东西的控制权在 A 手上,结果变成了 B ,Spring 管理的是 bean ,所以这里的控制权指的是 bean 的控制权,也就是对象的控制权进行了反转

之前我们依赖的一些对象,我们需要自己去创建,通过 new 来进行创建,有了 Spring 之后我们就不再进行创建了,而是由 Spring 帮助我们进行创建,这就叫控制反转

控制反转的一个优点主要是解耦

耦合度高就说明两个事务的关联性密切,我们项目开发软件设计的原则是高内聚,低耦合

高内聚 : 是指一个模块内部的关系(比如一个班级)

低耦合 : 是指各个模块之间的关系(比如各个班级)

高内聚低耦合就是,一个班级内需要团结协作,但是各个班级之间的相互影响要小,一个班级的问题对别的班级的影响要降低

Spring MVC 和 Spring Boot 都属于 Spring ,Spring MVC 是基于 Spring 的一个 MVC 框架 ,而 Spring Boot 是基于 Spring 的一套快速开发整合包

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

IoC 就是依赖的象的创建的控制权交给了 Spring 进行管理(存对象), DI 就是如何将依赖对象取出来,并赋给该对象的属性(取对象)

IoC 提供了两类注解 : 

1.类注解 : @Controller(控制器存储) , @Service(服务存储) , @Repository(仓库存储) , @Component(组件存储) , @Configuration(配置存储)

2.方法注解 : @Bean

接下来我们使用一下这些注解

①  @Controller

先创建一个 controller 包,在里面创建一个 UserController 类,用 @Controller 告诉 Spring 帮我们管理这个对象

package com.example.ioc.controller;import org.springframework.stereotype.Controller;//用 @Controller 告诉 Spring 帮我们管理这个对象
@Controller
public class UserController {public void doController(){System.out.println("do Controller...");}
}

然后在启动类 DemoApplication 中查看 Spring 有没有把上面这个 Controller 存进来呢

package com.example.ioc;
import com.example.ioc.controller.UserController;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {//Spring 上下文ApplicationContext context = SpringApplication.run(DemoApplication.class, args);//返回的就是 Spring 的运行环境UserController bean = context.getBean(UserController.class);bean.doController();}}

 运行出来了,说明存进去了

 

bean 一般使用这三个方法

②  @Service

package com.example.ioc.service;import org.springframework.stereotype.Service;@Service
public class UserService {public void doService(){System.out.println("do service....");}
}

依旧在启动类 DemoApplication 中查看

package com.example.ioc;import com.example.ioc.controller.UserController;
import com.example.ioc.service.UserService;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {//Spring 上下文ApplicationContext context = SpringApplication.run(DemoApplication.class, args);//返回的就是 Spring 的运行环境UserController bean = context.getBean(UserController.class);bean.doController();UserService userService = context.getBean(UserService.class);userService.doService();}}

成功拿到 

根据名称来获取 UserService 的 bean

(名称为类名转换为小驼峰,特殊情况就是如果类名前两位都是大写,那么bean的名称就是类名)

package com.example.ioc;import com.example.ioc.controller.UserController;
import com.example.ioc.service.UserService;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {//Spring 上下文ApplicationContext context = SpringApplication.run(DemoApplication.class, args);//返回的就是 Spring 的运行环境UserController bean = context.getBean(UserController.class);bean.doController();UserService userService = context.getBean(UserService.class);userService.doService();//根据名称来获取beanUserService userService1 = (UserService) context.getBean("userService");userService1.doService();}

根据名称+类型来拿 bean

package com.example.ioc;import com.example.ioc.controller.UserController;
import com.example.ioc.service.UserService;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {//Spring 上下文ApplicationContext context = SpringApplication.run(DemoApplication.class, args);//返回的就是 Spring 的运行环境UserController bean = context.getBean(UserController.class);bean.doController();UserService userService = context.getBean(UserService.class);userService.doService();//根据名称来获取beanUserService userService1 = (UserService) context.getBean("userService");userService1.doService();//根据名称和类型来获取 beanUserService userService2 = context.getBean("userService",UserService.class);userService2.doService();}

③  @Repository

package com.example.ioc.repo;import org.springframework.stereotype.Repository;@Repository
public class UserRepository {public void doRepository(){System.out.println("do repo...");}
}
package com.example.ioc;import com.example.ioc.controller.UserController;
import com.example.ioc.repo.UserRepository;
import com.example.ioc.service.UserService;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {//Spring 上下文ApplicationContext context = SpringApplication.run(DemoApplication.class, args);//返回的就是 Spring 的运行环境UserController bean = context.getBean(UserController.class);bean.doController();UserService userService = context.getBean(UserService.class);userService.doService();//根据名称来获取beanUserService userService1 = (UserService) context.getBean("userService");userService1.doService();//根据名称和类型来获取 beanUserService userService2 = context.getBean("userService",UserService.class);userService2.doService();UserRepository userRepository = context.getBean(UserRepository.class);userRepository.doRepository();}

④  @Component

package com.example.ioc.component;import org.springframework.stereotype.Component;@Component
public class UserComponent {public void doComponent(){System.out.println("do component");}
}
package com.example.ioc;import com.example.ioc.component.UserComponent;
import com.example.ioc.controller.UserController;
import com.example.ioc.repo.UserRepository;
import com.example.ioc.service.UserService;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {//Spring 上下文ApplicationContext context = SpringApplication.run(DemoApplication.class, args);//返回的就是 Spring 的运行环境UserController bean = context.getBean(UserController.class);bean.doController();UserService userService = context.getBean(UserService.class);userService.doService();//根据名称来获取beanUserService userService1 = (UserService) context.getBean("userService");userService1.doService();//根据名称和类型来获取 beanUserService userService2 = context.getBean("userService",UserService.class);userService2.doService();UserRepository userRepository = context.getBean(UserRepository.class);userRepository.doRepository();UserComponent userComponent = context.getBean(UserComponent.class);userComponent.doComponent();}}

⑤  @Configuration

package com.example.ioc.config;import org.springframework.context.annotation.Configuration;@Configuration
public class UserConfig {public void doConfig(){System.out.println("do configurarion...");}
}
package com.example.ioc;import com.example.ioc.component.UserComponent;
import com.example.ioc.config.UserConfig;
import com.example.ioc.controller.UserController;
import com.example.ioc.repo.UserRepository;
import com.example.ioc.service.UserService;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {//Spring 上下文ApplicationContext context = SpringApplication.run(DemoApplication.class, args);//返回的就是 Spring 的运行环境UserController bean = context.getBean(UserController.class);bean.doController();UserService userService = context.getBean(UserService.class);userService.doService();//根据名称来获取beanUserService userService1 = (UserService) context.getBean("userService");userService1.doService();//根据名称和类型来获取 beanUserService userService2 = context.getBean("userService",UserService.class);userService2.doService();UserRepository userRepository = context.getBean(UserRepository.class);userRepository.doRepository();UserComponent userComponent = context.getBean(UserComponent.class);userComponent.doComponent();UserConfig userConfig = context.getBean(UserConfig.class);userConfig.doConfig();}}

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

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

相关文章

Linux动静态库

文章目录 1. 静态库2. 动态库3. 动态库的加载 本章代码gitee仓库:动静态库 1. 静态库 Linux开发工具gcc/g篇,此篇文章讲过动静态库的基本概念,不了解的可以先看一下这篇文章。 现在我们先来制作一个简单的静态库 mymath.h #pragma once#i…

VSCode 好用的插件分享

文章目录 Introlistcode runner 【在文本编辑器中编辑好各类语言的源代码,然后一键运行】gitlens - 【git提交信息即时查看,类似IDEA中的 show annotation】还有更多,会日常补充。 Intro 大四毕业前,我只有一台dell latitude 455…

Web前端—小兔鲜儿电商网站底部设计及网站中间过渡部分设计

版本说明 当前版本号[20231116]。 版本修改说明20231116初版 目录 文章目录 版本说明目录底部(footer)服务帮助中心版权 banner侧边栏圆点 新鲜好物(goods)标题 底部(footer) 结构:通栏 >…

Python框架篇(2):FastApi-参数接收和验证

提示: 如果想获取文章中具体的代码信息,可在微信搜索【猿码记】回复 【fastapi】即可。 1.参数接收 1.1 路径参数(不推荐) 1.代码清单 在app/router下,新增demo_router.py文件,内容如下: from fastapi import APIRouterrouter APIRouter( prefix&qu…

【二分法】

二分法可以在有序排列中&#xff0c;通过不断对半切割数据&#xff0c;提高数据查找效率。 lst [1,4,6,7,45,66,345,767,788,999] n 66 left 0 right len(lst)-1 while left < right: #边界&#xff0c;当右边比左边还小的时候退出循环 mid (left right)//2 …

2023年05月 Python(六级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 明明每天坚持背英语单词,他建立了英语单词错题本文件“mistakes.txt”,将每天记错的单词增加到该文件中,下列打开文件的语句最合适的是?( ) A: f = open(“mistakes.txt”) B: …

2023.11.16 hivesql高阶函数之开窗函数

目录 1.开窗函数的定义 2.数据准备 3.开窗函数之排序 需求:用三种排序方法查询学生的语文成绩排名,并降序显示 4.开窗函数分组 需求:按照科目来分类,使用三种排序方式来排序学生的成绩 5.聚合函数与分组配合使用 6.聚合函数同时和分组以及排序关键字配合使用 --需求1&…

MySQL主主复制

主1 192.168.66.15 主2 192.168.66.16 主1&#xff1a; roottest2 ~]# hostname master1 [roottest2 ~]# bash [rootmaster1 ~]# vim /etc/my.cnf server-id11 log-binmysql-bin auto_increment_increment2 auto_increment_offset1 replicate-do-dbdemo_db …

缩放图片算法优化 sse

前情提要 这里实现了打印文件的缩放算法 缩放打印文件&#xff08;prt,prn&#xff09; 核心功能如下&#xff1a; void CZoomPrtFile::zoomPrtFile(BYTE* pTargetData) {float xRatio static_cast<float>(m_perWidth - 1) / m_zoomWidth;float yRatio static_cast<…

OpenHarmony应用开发入门教程(一、开篇)

前言 华为正式宣布2024年发布的华为鸿蒙OS Next版将不再兼容安卓系统。这一重大改变&#xff0c;预示着华为鸿蒙OS即将进入一个全新的阶段。 都说科技无国界&#xff0c;这是骗人的鬼话。谷歌的安卓12.0系统早已发布&#xff0c;但是自从受到美影响&#xff0c;谷歌就拒绝再向…

网络安全(大厂面试真题集)

前言 随着国家政策的扶持&#xff0c;网络安全行业也越来越为大众所熟知&#xff0c;想要进入到网络安全行业的人也越来越多。 为了拿到心仪的 Offer 之外&#xff0c;除了学好网络安全知识以外&#xff0c;还要应对好企业的面试。 作为一个安全老鸟&#xff0c;工作这么多年…

android studio导入eclipse项目

网上下载一个老工程&#xff0c;.project文件里有eclipse。 android studio导入eclipse项目 eclipse项目结构 Android studio文件结构 下面是导入步骤&#xff1a; 第一步&#xff0c;打开一个项目。 选择File->New->Import Project 第二步&#xff0c;选择Eclipse项目根…

如何设计开发一对一交友App吸引更多活跃用户

在当今社交媒体时代&#xff0c;一对一交友App开发正日渐成为发展热点。如何吸引更多活跃用户成为开发者们的首要任务。通过本文&#xff0c;我们将探讨一系列方法&#xff0c;助您设计开发一对一交友App&#xff0c;吸引更多用户的关注和参与&#xff0c;提升App的活跃度。 了…

elementplus DateTimePicker 日期范围选择器 设置默认时间范围为当前月的起始时间到结束时间

代码如下&#xff1a; <el-date-pickerv-model"value"type"datetimerange"start-placeholder"Start Date"end-placeholder"End Date":default-time"defaultTime" />const defaultTime: [Date, Date] [new Date(2000…

小米手环8pro重新和手机配对解决办法

如果更换了手机&#xff0c;那么小米手环8pro是无法和新手机自动连接的。 但是在新手机上直接连接又连接不上&#xff0c;搜索蓝牙根本找不到手环的蓝牙。 解决办法就是&#xff1a; 把手环恢复出厂&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 是的&…

服务器数据恢复—服务器raid5离线磁盘上线同步失败的数据恢复案例

服务器数据恢复环境&故障&#xff1a; 某品牌DL380服务器中有一组由三块SAS硬盘组建的RAID5阵列。数据库存放在D分区&#xff0c;数据库备份存放在E分区。 服务器上有一块硬盘的状态灯显示红色&#xff0c;D分区无法识别&#xff0c;E分区可识别&#xff0c;但是拷贝文件报…

Node.js详解

一、是什么 Node.js 是一个开源与跨平台的 JavaScript 运行时环境 在浏览器外运行 V8 JavaScript 引擎&#xff08;Google Chrome 的内核&#xff09;&#xff0c;利用事件驱动、非阻塞和异步输入输出模型等技术提高性能 可以理解为 Node.js 就是一个服务器端的、非阻塞式I/…

【XTDrone Ubuntu20.04】XTDrone+ Ubuntu20.04 + PX4安装

XTDrone仿真平台配置 文章目录 XTDrone仿真平台配置依赖安装 ROS一键安装Marvos安装PX4 安装安装QTGroundControlXTDrone下载安装 环境&#xff1a; VMWare 16.0 Ubuntu 22.04 &#xff08;因为没人配过&#xff09;Ubuntu 20.04 参考文章&#xff1a; 仿真平台基础配置 (yuq…

Qt QWebSocket实现JS调用C++

目录 前言1、QWebChannel如何与网页通信2、QWebSocketQWebChannel与网页通信2.1 WebSocketTransport2.2 WebSocketClientWrapper2.3 初始化WebSocket服务器2.4 前端网页代码修改 总结 前言 本篇主要介绍实现JS调用C的另一种方式&#xff0c;即QWebSocketQWebChannel。与之前的…

RabbitMQ之消息应答和持久化

文章目录 前言一、消息应答1.概念2.自动应答3.消息应答方法4.Multiple 的解释5.消息自动重新入队6.消息手动应答代码7.手动应答效果演示 二、RabbitMQ持久化1.概念2.队列如何实现持久化3.消息实现持久化4.不公平分发5.预取值 总结 前言 在RabbitMQ中&#xff0c;我们的消费者在…