当前位置: 首页 > news >正文

理解SpringIOC和DI第一课(Spring的特点),IOC对应五大注解,ApplicationContext vs BeanFactory

Spring是一个包含众多工具等Ioc容器

对象这个词在Spring范围内,称为bean

Spring两大核心思想

1.IOC     (IOC是控制反转,意思是控制权反转-控制权(正常是谁用这个对象,谁去创建,)-控制对象的控制权,反转的意思是创建对象的控制权,交给了Spring)

优点:解耦合

高内聚:一个模块内部的关系

低耦合:各个模块之间前的关系

2.AOP

list/map装数据的容器

tomcat装的是web的容器

Spring容器,装的是对象

引入案列(为什么推荐用Spring)

上面代码的改动成本太大,耦合性太高

如果改成代码这种,传递的是对象,就直接给对象

不采用生成对象,而是你给我什么我就用什么这种,也就是你需要往里面(就像是下面这个图,在main中传递对象。)

IOC帮助我们做这个工作。

Spring可以帮助我们创建对象,可以往里面存,也可以从这个里面取,

我们要做的也就是1.告诉Spring,帮我们创建对象,2.知道如何取出来这些对象

DI是一种实现方式(依赖注入)

@Autowiredprivate BookService bookService;

假如说加上,上面的Autowired就相当于下面的这个意思

Autowired:告诉Spring,从容器中取出这个对象,赋值给当前对象的属性

 private BookService bookService;public BookController(){bookService=new BookService();}
@Component:告诉Spring,帮助我们存储对象。
@Component
public class BookService {@Autowiredprivate BookDao bookDao;
//    private BookService bookService;
//
//    public BookController(){
//        bookService=new BookService();
//    }public List<BookInfo> getBookList() {List<BookInfo> bookInfos = bookDao.mockData();for (BookInfo bookInfo : bookInfos) {if (bookInfo.getStatus() == 1) {bookInfo.setStatusCN("可借阅");} else {bookInfo.setStatusCN("不可借阅");}}return bookInfos;}
}

MVC提供了注解,前面的RequestMapping。

IOC(依赖对象的创建的控制权,存)一种思想,DI(依赖注入)是一种实现方式

DI是把依赖对象取出来,并且赋给该对象属性(取)

DI主要通过两类注解类型可以实现

IOC提供两类注解

1.类注解:@Controller,@Service,@Respository,@Component,@Configuration

2.方法注解:@Bean

package com.example.IOCtry;import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
//加上Controller才会不报错,假如不加上Controller就会报错
//@Controller
public class UserController {public void prin(){System.out.println("春节快乐");
}
}
package com.example.IOCtry;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;@SpringBootApplication
public class IoCtryApplication {public static void main(String[] args) {//启动类是帮助我们启动spring,这个命令可以返回一个spring//context上下文,就是spring一个运行环境ApplicationContext context=SpringApplication.run(IoCtryApplication.class, args);//从容器中拿对象UserController bean=context.getBean(UserController.class);//如果去掉Control注解,就会报错bean.prin();}}

会报这个错误,意思是说没哟拿到bean这个对象

下面这个是getBean的根据名称拿一个类(注意:这个的获取规范是小驼峰),注意这个返回的是一个Object,所以我们需要对他进行类型转换

第三种:根据名称和类名拿

 public static void main(String[] args) {//启动类是帮助我们启动spring,这个命令可以返回一个spring//context上下文,就是spring一个运行环境ApplicationContext context=SpringApplication.run(IoCtryApplication.class, args);//从容器中拿对象UserController bean=context.getBean(UserController.class);//如果去掉Control注解,就会报错bean.prin();UserService bean2=context.getBean(UserService.class);bean2.doService();UserService bean3=(UserService) context.getBean("userService");bean3.doService();//根据名称和类型获取beanUserService userService=context.getBean("userService",UserService.class);userService.doService();}}

⚠️特殊情况:假如类名前两位(第一位,第二位字母)都是大写的情况,bean的名称是类名

常见面试题ApplicationContext   vs      BeanFactory

获取bean对象,是父类BeanFactory提供的功能

继承关系和功能方面来说:Spring容器有两个顶级的接口:BeanFactory和ApplicationContext.其中BeanFactory提供基础的访问容器能力,而ApplicationContext属于是BeanFactory的子类,他除了继承了BeanFactory的所有功能之外,他还拥有独特的特性,国际化支持(中日韩等语言)资源访问支持,以及事件传播等方面的支持

从性能方面来说:ApplicationContext是一次性加载并初始化所有的Bean对象,而BeanFactory是需要哪个就去加载哪个,因此会更加清量(空间与时间)

@Service(服务存储)和下面使用方法一致
@Repository(仓库存储)和control使用方法一致
@Repository
public class UserRepository {public void doRepository() {//代码格式化快捷键,crtl+alt+lSystem.out.println("aini");}}
 UserRepository userRepository=context.getBean(UserRepository.class);userRepository.doRepository();
@Component(组件存储)和下面用法一致
@Configuration(配置存储)
//        UserRepository userRepository=context.getBean(UserRepository.class);
//        userRepository.doRepository();
//        UserComponent userComponent=context.getBean(UserComponent.class);
//        userComponent.doComponent();UserConfig userConfig=context.getBean(UserConfig.class);userConfig.doConfig();}
package com.example.IOCtry.config;import org.springframework.context.annotation.Configuration;@Configuration
public class UserConfig {public void doConfig(){System.out.println("我也是条狗");}
}
为什么要去分层,假如说都用一个注解不行吗?-这就跟车牌号一样,方便管理,也节约号码

常见面试题二

常用的注解有哪些?分别是什么作用

web url映射:@RequestMapping

参数接口和接口响应:@RequestParam,@RequestBody,@ResponseBody

Bean的存储:@Controller,@Service,@Repository,@Component,@Configuration,@Bean

Bean的获取:@Autowired,@Qualifier,@Resource

相关文章:

理解SpringIOC和DI第一课(Spring的特点),IOC对应五大注解,ApplicationContext vs BeanFactory

Spring是一个包含众多工具等Ioc容器 对象这个词在Spring范围内&#xff0c;称为bean Spring两大核心思想 1.IOC (IOC是控制反转&#xff0c;意思是控制权反转-控制权&#xff08;正常是谁用这个对象&#xff0c;谁去创建&#xff0c;&#xff09;-控制对象的控制权&#xf…...

【微服务】分布式限流如何实现

Sentinel 是一款阿里巴巴开源的分布式系统级流量控制组件&#xff0c;它提供了流量的自适应控制、熔断降级、系统负载保护等功能。下面是使用 Sentinel 实现分布式限流方案的基本步骤&#xff1a; 引入 Sentinel 依赖&#xff1a;首先在你的 Java 项目中引入 Sentinel 的相关依…...

【S32K3环境搭建】-0.3-S32DS安装实时驱动RTD(Real-Time Driver)

目录 1 什么是“实时驱动RTD(Real-Time Driver)” 2 安装“实时驱动RTD(Real-Time Driver)” 2.1 方法一&#xff1a;通过S32DS Extensions and Updates安装“实时驱动RTD(Real-Time Driver)” 2.2 方法二&#xff1a;通过Install New Software…安装“实时驱动RTD(Real-Ti…...

软件设计之适配器模式

类模式 我们知道插座的电压为交流电220V&#xff0c;而日常电器使用的是直流电且电压会较小&#xff0c;比如手机充电会通过插头适配器达到额定的输入电流。下面我们实现这个案例&#xff1a;将220V电压转化为5V的电压。 package Adapter.Class;public class Adapter extends …...

虚拟化逻辑架构:OVS 交换机与端口管理

目录 一、实验 1.OVS 交换机管理 2.OVS端口管理 二、问题 1.KVM下的br0和virbr0有何区别 2.OVS 虚拟交换机 与接口如何实现关联的创建和删除 3.两个ovs之间如何进行流量交互 4.虚拟网络如何和物理网络互联 一、实验 1.OVS 交换机管理 &#xff08;1&#xff09;查看网…...

【springboot】idea项目启动端口被占用

问题 idea本地启动springboot项目端口老是被占用 解决 关闭被占用的端口进程 步骤: 1. winR打开程序框 2. 查出被占用端口的进程id netstat -ano | finderstr 端口号 例如 netstat -ano | finderstr 81013.杀死进程 taskkill /pid 进程id -t -f 例如 taskkill /pid 2…...

linux环境下编译安装OpenCV For Java(CentOS 7)

最近在业余时间学习了一些有关图像处理的代码&#xff0c;但是只能本地处理&#xff0c;满足不了将来开放远程服务的需求。 因此&#xff0c;查找并参考了一些资料&#xff0c;成功在centos7环境安装上了opencv 460。 下面上具体安装步骤&#xff0c;希望能帮到有需要的同学。 …...

健康学习到 150 岁:人体系统调优不完全指南 | 开源日报 No.93

jesseduffield/lazygit Stars: 40.0k License: MIT lazygit&#xff0c;一个用 Go 语言编写的简单终端UI工具&#xff0c;可以执行 Git 命令。 该项目旨在让使用者更加方便地使用 Git&#xff0c;并提供了以下功能&#xff1a; 可视化操作&#xff1a;用户可以通过图形界面进…...

C++ Easyx 三子棋

目录 思路 框架​编辑 读取操作 数据操作 绘制画面 游戏的数据结构 用二维数组来模拟棋盘格 赢的情况 平局情况 Code 代码细节部分 &#xff08;1&#xff09;初始化棋盘格 &#xff08;2&#xff09; 初始化棋子类型​编辑 事件处理部分 落子 框架内代码的完善 数据处…...

[NAND Flash 2.1] NAND Flash 闪存改变了现代生活

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 专栏 《深入理解NAND Flash》 <<<< 返回总目录 <<<< ​ 1989年NAND闪存面世了&#xff0c;它曾经且正在改变了我们的日常生活。 NAND 闪存发明之所以伟大&#xff0c;是因为&#xff0c…...

2015年五一杯数学建模B题空气污染问题研究解题全过程文档及程序

2015年五一杯数学建模 B题 空气污染问题研究 原题再现 近十年来&#xff0c;我国 GDP 持续快速增长&#xff0c;但经济增长模式相对传统落后&#xff0c;对生态平衡和自然环境造成一定的破坏&#xff0c;空气污染的弊病日益突出&#xff0c;特别是日益加重的雾霾天气已经干扰…...

java面试题,上楼梯有多少种方式

java面试题&#xff0c;上楼梯有多少种方式 题目&#xff1a;一个小孩上一个N级台阶的楼梯&#xff0c;他可以一次走1阶、2阶或3阶&#xff0c;那么走完N阶有多少种方式。 很自然的想法是使用递归&#xff1a; public class Test04 { public static int countWays(int n) {…...

8.HTTP工作原理

HTTP是什么 HTTP工作原理 HTTP协议的请求类型和响应状态码 总结 1.HTTP是什么 HTTP超文本传输协议就是在一个网络中上传下载文件的一套规则 2.HTTP工作原理 HTTP超文本传输协议的本质是TCP通信&#xff0c;链接—>请求—>响应—>断开 3.HTTP协议的请求类型和响应状…...

环境部署的学习笔记(Docker)

1 前言 在现场测试时&#xff0c;常常需要在现场机器上搭建开发环境&#xff0c;此时使用容器会是一个比较方便的途径&#xff1b; 2 常见的容器技术 2.1 Docker⭐️31k&#xff1a;目前使用最为广泛的容器技术 2.2 Nix⭐️13.8k&#xff1a;镜像文件占用会比Docker少 Chat…...

Navicat在分辨率不同的屏幕窗口显示大小不一致问题解决

1.主屏幕为2560*1600分辨率&#xff0c;能够显示较多数据连接 2.在第二屏幕分辨率低&#xff0c;字体变大&#xff0c;显示内容变少 解决办法&#xff1a; 1.右击navicat图标-属性 2.选择【兼容性】-在兼容性页面中选择**“更改高DPI设置”** 3…勾选“高DPI缩放替代”&a…...

通过代码搞明白JAVA中值传递和引用传递

public static void main(String[] args) {Map a new HashMap();a.put("a", 1);System.out.println(a "我在main中的值");aaa(a);System.out.println(a "我在main中的值");bbb(a);System.out.println(a "我在main中的值");int b …...

ambari 开启hdfs回收站机制

hdfs回收站类似于我们常用的windows中的回收站&#xff0c;被删除的文件会被暂时存储于此&#xff0c;和回收站相关的参数有两个&#xff1a; fs.trash.interval&#xff1a;默认值为0 代表禁用回收站&#xff0c;其他值为回收站保存文件时间&#xff0c;单位为分钟 fs.trash…...

服务器数据恢复—服务器重装系统导致逻辑卷发生改变的数据恢复案例

服务器数据恢复环境&#xff1a; 某品牌linux操作系统服务器&#xff0c;服务器中有4块SAS接口硬盘组建一组raid5阵列。服务器中存放的数据有数据库、办公文档、代码文件等。 服务器故障&检测&#xff1a; 服务器在运行过程中突然瘫痪&#xff0c;管理员对服务器进行了重装…...

软件工程之架构设计

从公众号转载&#xff0c;关注微信公众号掌握更多技术动态 --------------------------------------------------------------- 一、架构设计的目的 1.什么是复杂的软件项目 复杂的软件项目通常有两个特点&#xff1a; 需求不确定 技术复杂 技术的复杂性主要体现在四个方面…...

oracle java.sql.SQLException: Invalid column type: 1111

1.遇到的问题 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{propertyuuid, modeIN, javaTypeclass java.lang.String, jdbcTypenull, numericScalenull, r…...

电商客服机器人如何通过 Taotoken 动态选择性价比最优的模型

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 电商客服机器人如何通过 Taotoken 动态选择性价比最优的模型 在电商客服场景中&#xff0c;用户咨询的问题复杂度差异巨大。从简单…...

大语言模型记忆增强框架:LightMem原理、实现与工程实践

1. 项目概述&#xff1a;当大模型遇上“记忆”瓶颈最近在折腾大语言模型&#xff08;LLM&#xff09;应用开发的朋友&#xff0c;估计都遇到过同一个头疼的问题&#xff1a;模型记不住事儿。你精心设计了一个对话系统&#xff0c;希望它能记住用户的历史偏好&#xff0c;比如“…...

三步搞定RPG Maker游戏资源解密:零基础完整指南

三步搞定RPG Maker游戏资源解密&#xff1a;零基础完整指南 【免费下载链接】RPGMakerDecrypter Tool for decrypting and extracting RPG Maker XP, VX and VX Ace encrypted archives and MV and MZ encrypted files. 项目地址: https://gitcode.com/gh_mirrors/rp/RPGMake…...

别再傻傻分不清了!Numpy里ndarray和array到底啥区别?新手避坑指南

别再傻傻分不清了&#xff01;Numpy里ndarray和array到底啥区别&#xff1f;新手避坑指南 刚接触Numpy的Python开发者&#xff0c;几乎都会在ndarray和array()这两个概念上栽跟头。明明看起来都能创建数组&#xff0c;为什么文档里一会儿用np.array()&#xff0c;一会儿又冒出个…...

深度拆解:ReID 跨镜跟踪短板,对比镜像视界无感定位优势前言:跨镜追踪的本质不是 “认长相”,而是 “追空间”跨镜连续追踪,是数字孪生、视频孪生、全域安防与实景管控的核心底座能力。

深度拆解&#xff1a;ReID 跨镜跟踪短板&#xff0c;对比镜像视界无感定位优势前言&#xff1a;跨镜追踪的本质不是 “认长相”&#xff0c;而是 “追空间”跨镜连续追踪&#xff0c;是数字孪生、视频孪生、全域安防与实景管控的核心底座能力。行业长期依赖 ReID&#xff08;行…...

G-Helper风扇控制终极指南:从静音办公到狂暴游戏的全场景调校

G-Helper风扇控制终极指南&#xff1a;从静音办公到狂暴游戏的全场景调校 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenb…...

QtUnblockNeteaseMusic终极指南:高效解锁网易云音乐地区限制

QtUnblockNeteaseMusic终极指南&#xff1a;高效解锁网易云音乐地区限制 【免费下载链接】QtUnblockNeteaseMusic A desktop client for UnblockNeteaseMusic, made with Qt. 项目地址: https://gitcode.com/gh_mirrors/qt/QtUnblockNeteaseMusic QtUnblockNeteaseMusic…...

从零到一:手把手带你完成DevEco Studio环境搭建与项目启动

1. 环境准备&#xff1a;从下载到安装的完整指南 第一次接触HarmonyOS开发的朋友们&#xff0c;你们好&#xff01;我是老张&#xff0c;在智能硬件行业摸爬滚打十多年&#xff0c;今天要带大家搞定DevEco Studio这个开发利器。很多人刚开始都会被环境搭建劝退&#xff0c;其实…...

怎样高效搭建AI多智能体交易系统:3步快速部署完整方案

怎样高效搭建AI多智能体交易系统&#xff1a;3步快速部署完整方案 【免费下载链接】TradingAgents-AI.github.io TradingAgents: Multi-Agents LLM Financial Trading Framework 项目地址: https://gitcode.com/GitHub_Trending/tr/TradingAgents-AI.github.io 想要让AI…...

RocketMQ 5.1.1 Topic管理:从创建到删除,一份完整的mqadmin命令行实战手册

RocketMQ 5.1.1 Topic全生命周期管理实战指南 接手一个新的RocketMQ集群时&#xff0c;Topic管理往往是日常运维中最频繁的操作之一。不同于简单的命令堆砌&#xff0c;本文将带您深入理解Topic从创建到销毁的完整生命周期&#xff0c;通过真实生产环境中的典型场景&#xff0c…...