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.rhkb.cn/news/194533.html

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

相关文章

SAP PI/PO中使用UDF解决按字节拆分字符串的需求

需求背景: SAP需要将采购订单信息通过PI发送到SFTP服务器上,生成文件,一般对日项目上文件内容通常都是按照指定的字节数拆分的,而不是字符数,类似下面的格式。 问题点: 如果是使用FTP适配器,则…

MySQL JDBC编程

MySQL JDBC编程 文章目录 MySQL JDBC编程1. 数据库编程的必备条件2. Java的数据库编程:JDBC3. JDBC工作原理4. JDBC使用5. JDBC常用接口和类5.1 JDBC API5.2 数据库连接Connection5.3 Statement对象5.4 ResultSet对象 1. 数据库编程的必备条件 编程语言:…

[PyTorch][chapter 63][强化学习-时序差分学习]

目录: 蒙特卡罗强化学习的问题 基于转移的策略评估 时序差分评估 Sarsa-算法 Q-学习算法 一 蒙特卡罗强化学习的的问题 有模型学习: Bellman 等式 免模型学习: 蒙特卡罗强化学习 迭代: 使用策略 生成一个轨迹, for t…

京联易捷科技与劳埃德私募基金管理有限公司达成合作协议签署

京联易捷科技与劳埃德私募基金管理有限公司今日宣布正式签署合作协议,双方在数字化进程、资产管理与投资以及中英金融合作方面将展开全面合作。 劳埃德(中国)私募基金管理有限公司是英国劳埃德私募基金管理有限公司的全资子公司,拥有丰富的跨境投资经验和卓越的募资能力。该集…

LEEDCODE 220 存在重复元素3

class Solution { public:int getId(int a, int valuediff){// 值// return a/(valuediff1);return a < 0 ? (a ) -) / (valuediff 1) - 1 : a / (valuediff 1);}public: unordered_map<int, int> bucket;bool containsNearbyAlmostDuplicate(vector<int>&am…

【Java实现图书管理系统】

图书管理系统 1. 设计背景2. 设计思路3. 模块展示代码演示3.1 Book类3.2 BookList类&#xff08;书架类&#xff09;3.4 用户类 - User类3.5 子类管理员类 -- AdminUser类3.6 子类普通用户类 -- NormalUser类3.7 操作接口3.8 操作类3.8.1 查找操作 -- FindOperation类3.8.2 增加…

【excel技巧】Excel表格里的图片如何批量调整大小?

Excel表格里面插入了很多图片&#xff0c;但是每张图片大小不一&#xff0c;如何做到每张图片都完美的与单元格大小相同&#xff1f;并且能够根据单元格来改变大小&#xff1f;今天分享&#xff0c;excel表格里的图片如何批量调整大小。 方法如下&#xff1a; 点击表格中的一…

VBA技术资料MF83:将Word文档批量另存为PDF文件

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…

JS原生-弹框+阿里巴巴矢量图

效果&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content&q…

Linux_系统信息_uname查看内核版本、内核建立时间、处理器类型、顺便得到操作系统位数等

1、uname --help 使用uname --help查看uname命令的帮助信息 2、uname -a 通过上面的help就知道-a选项显示全部内容时的含义了。 内核名是Linux主机名是lubancat&#xff0c;如果想看主机名可以使用命令hostname&#xff1b;内核版本是Linux 4.19.232&#xff0c;建立时间为2…

NewStarCTF2023 Reverse方向Week3 ez_chal WP

分析 题目&#xff1a;ez_chal 一个XTEA加密&#xff0c; V6是key&#xff0c;v5是输入&#xff0c;然后v7就是密文。 看了v6&#xff0c;要用动调。 ELF文件用ida的远程调试。 然后在kali上输入长度为32的flag 全部转换成dd 再提取密文。 EXP #include <stdio.h>…

使用Spring Boot实现大文件断点续传及文件校验

一、简介 随着互联网的快速发展&#xff0c;大文件的传输成为了互联网应用的重要组成部分。然而&#xff0c;由于网络不稳定等因素的影响&#xff0c;大文件的传输经常会出现中断的情况&#xff0c;这时需要重新传输&#xff0c;导致传输效率低下。 为了解决这个问题&#xff…

OpenCV中的像素重映射原理及实战分析

引言 映射是个数学术语&#xff0c;指两个元素的集之间元素相互“对应”的关系&#xff0c;为名词。映射&#xff0c;或者射影&#xff0c;在数学及相关的领域经常等同于函数。 基于此&#xff0c;部分映射就相当于部分函数&#xff0c;而完全映射相当于完全函数。 说的简单点…

2.FastRunner定时任务Celery+RabbitMQ

注意&#xff1a;celery版本和Python冲突问题 不能用高版本Python 用3.5以下&#xff0c;因为项目的celery用的django-celery 3.2.2 python3.7 async关键字 冲突版本 celery3.x方案一&#xff1a; celery3.xpython3.6方案二 &#xff1a; celery4.xpython3.7 解决celery执…

海康Visionmaster-环境配置:VB.Net 二次开发环境配 置方法

Visual Basic 进行 VM 二次开发的环境配置分为三步。 第一步&#xff0c;使用 VS 新建一个框架为.NET Framework 4.6.1&#xff0c;平台去勾选首选 32 为的工程&#xff0c;重新生成解决方案&#xff0c;保证工程 Debug 下存在 exe 文件&#xff0c;最后关闭新建工程&#xff1…

2024有哪些免费的mac苹果电脑内存清理工具?

在我们日常使用苹果电脑的过程中&#xff0c;随着时间的推移&#xff0c;可能会发现设备的速度变慢了&#xff0c;甚至出现卡顿的现象。其中一个常见的原因就是程序占用内存过多&#xff0c;导致系统无法高效地运行。那么&#xff0c;苹果电脑内存怎么清理呢&#xff1f;本文将…

Linux动静态库

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

Jmeter- Beanshell语法和常用内置对象(网络整理)

在利用jmeter进行接口测试或者性能测试的时候&#xff0c;我们需要处理一些复杂的请求&#xff0c;此时就需要利用beanshell脚本了&#xff0c;BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法&#xff0c;所以它和java是可以无缝衔接的。beans…

<MySQL> 什么是数据库索引?数据库索引的底层结构是什么?

目录 一、什么是数据库索引? 1.1 索引的概念 1.2 索引的特点 1.3 索引的适用场景 1.4 索引的使用 1.4.1 创建索引 1.4.2 查看索引 1.4.3 删除索引 二、数据库索引的底层结构是什么&#xff1f; 2.1 数据库中的 B树 长啥样&#xff1f; 2.2 B树为什么适合做数据库索…

B树与B+树

B树 B树&#xff0c;又称多路平衡查找树&#xff0c;B树中所有结点的孩子个数的最大值称为B树的阶&#xff0c;通常用m表示。一颗m阶B树或为空树&#xff0c;或为满足如下特征的m叉树。 树中每个结点至多有m棵子树&#xff0c;即至多含有m-1个关键字若根结点不是终端结点&…