spring的两大思想:IOC与AOP

一、ioc的概念

什么叫控制翻转?

之前:

对象的使用方,创建对象,对象的控制权,在对象的使用方手中.

spring:

对象的控制权交给了spring.

举个例子:智能驾驶,之前车的使用权在人手中,而现在在ai手中,这就是控制反转.

什么叫ioc:

之前车企生产车需要做整个车,费事费力无法定制化,而现在车企将轮胎轮毂车底等外包给别人做,自己制作组装:

二、DI

本质上就是想在不new的基础上完成对象引入,目的是解耦.

依赖注入分为三种:

1.属性注入

    @Autowiredprivate  StudentController studentController;public void say(){System.out.println("helloworld");studentController.say();}

@Autowired就是属性注入的注释\

正常来说应该是

这样,但是加了属性注入注释就将这个注入到这个对象中了.

// 1. 定义一个服务类(被依赖的对象)
@Service // 告诉Spring:这是一个服务,需要被容器管理
public class UserService {public void doService() {System.out.println("执行服务逻辑");}
}// 2. 定义控制器(需要依赖的对象)
@Controller // 告诉Spring:这是一个控制器,需要被容器管理
public class UserController {// 3. 声明依赖:告诉Spring,我需要一个UserService对象@Autowired private UserService userService;public void doController() {// 直接使用注入的对象,不用自己newuserService.doService(); }
}

@Autowired会根据名称进行注入,如果服务类中有多个名字对不上的该怎么办呢?有三种方法:

@Autowired与@Resource的区别:

1.注入顺序

  @Autowired:默认按类型(Type)匹配注入。

  • 先根据字段 / 参数的类型在 Spring 容器中查找匹配的 Bean。
  • 如果存在多个同类型的 Bean,需要配合 @Qualifier 注解按名称(Name)筛选,否则会报错。
    示例:
    @Autowired
    @Qualifier("userServiceA") // 指定名称为userServiceA的Bean
    private UserService userService;

    @Resource:默认按名称(Name)匹配注入,名称可以通过 name 属性指定。

  • 若未指定 name,则默认使用字段名或 setter 方法名作为 Bean 名称。
  • 若按名称找不到匹配的 Bean,会 fallback 到按类型匹配。
    示例:
    @Resource(name = "userServiceA") // 直接指定Bean名称
    private UserService userService;// 未指定name时,默认按字段名"userService"查找
    @Resource
    private UserService userService;
2.来源

@Autowired是spring提供的注释,@Resource是JDK提供的注释.

2.构造方法注入

通过构造方法进行注入

package com.example.demo;import org.springframework.stereotype.Controller;// 控制器类(需要依赖的对象)
@Controller
public class UserController {// 依赖的服务对象,使用final修饰确保不可变private final UserService userService;// 构造方法注入:通过构造方法传入依赖// Spring会自动找到匹配的UserService对象注入进来public UserController(UserService userService) {this.userService = userService;}public void showUserName() {// 使用注入的依赖对象System.out.println("用户名:" + userService.getUserName());}
}

总所周知,构造方法可以有无参和有参,这是怎么告诉spring哪个是我们想要的:

@Controller
public class UserController {private final UserService userService;// 无参构造方法(手动定义)public UserController() {// 注意:如果用无参构造创建对象,userService会为nullthis.userService = null;}// 有参构造方法(用于注入依赖)@Autowired // 必须添加,否则Spring会优先用无参构造public UserController(UserService userService) {this.userService = userService;}public void doSomething() {userService.doService(); // 只有通过有参构造创建的对象才能正常调用}
}

3.setter方法注入

package com.example.demo;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;@Controller
public class UserController {private UserService userService;// setter方法注入:通过setter方法传入依赖@Autowired // 标注在setter方法上public void setUserService(UserService userService) {this.userService = userService;}public void showUserName() {// 使用注入的依赖对象System.out.println("用户名:" + userService.getUserName());}
}

三、bean的存储

将对象交给spring进行管理可以使用下面的这些注释:

类注解:

用代码来讲解:

@Controller
public class UserController {public void say(){System.out.println("hello world");}
}

创建一个UserController类,如果要使用其中的对象就得new UserController(),来实例化对象,而此处我们加上@Controller后就是将对象托管给spring,而我们只需要从Spring中取对象即可,下面讲解一下取对象的具体步骤:

@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {ApplicationContext context=SpringApplication.run(DemoApplication.class, args);//1.通过类型取UserController controller=context.getBean(UserController.class);controller.say();//2.通过名字取UserController userController1=(UserController) context.getBean("userController");userController1.say();//3.通过名字和类型双重查找UserController userController2=context.getBean("userController",UserController.class);userController2.say();}}

之后几个跟controller差不多

方法注解:

使用场景:

1.想修改第三方的无法修改的类

2.想使用多个对象时

代码解释:如此时有个无法修改的第三方类

@AllArgsConstructor//添加一个全参数的构造函数
@NoArgsConstructor//添加一个无参数的构造函数
@Data
public class Student {private String name;private int age;
}

想使用它只能外置一个类:

@Component
public class StudentController {@Beanpublic Student userInfo(){return new Student("zhansan",15);}
}

注意此处的方法注释@Bean必须和任意一个类注释一起使用,要先让spring知道你需要托管.

另外也可以new多个对象,但这里就不能通过类型去取了:

@Component
public class StudentController {@Beanpublic Student userInfo(){return new Student("zhangsan", 20);}@Beanpublic Student userInfo1(){return new Student("lisi", 22);}
}

也可以修改默认名字或者添加复数个名字:

指定扫描路径

在spring搜索bean位置的时候会根据包的存储位置存储

也就是这个,有可能你分的包比较多,让spring无法搜索到你指定的bean,是可以进行修改的:

@ComponentScan("com.example.dome")

总结:

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

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

相关文章

【图像处理基石】Segment Anything Model (SAM) 调研

Segment Anything Model (SAM) 是由 Meta AI 开发的革命性图像分割模型,它能够对图像中的任何物体进行分割,无需针对特定类别进行训练。SAM 具有以下特点: 通用性:可以分割任何视觉对象,无论是否见过该类别 灵活性:支持多种输入提示(点、框、掩码或文本) 实时性:在普通…

unisS5800XP-G交换机配置命令之端口篇

一、批量配置端口(1) 进入系统视图。system-view(2) 指定接口范围&#xff0c;并进入接口批量配置视图。¡ 指定一个不带别名的接口列表。interface range { interface-type interface-number [ to interface-type interface-number ] } &<1-24>¡…

MySQL中的 redolog

什么是redo log如果我们只在内存的 Bufer Pool中修改了页面&#xff0c;假设在事务提交后突然发生了某个故障导致内存中的数据都失效了&#xff0c;那么这个已经提交的事务在数据库中所做的更改也就跟着丢失了&#xff0c;这是我们所不能忍受的。那么&#xff0c;如何保证这个持…

数据结构之 【排序】(非递归实现快速排序)

目录 1.引入 2.非递归实现快排的思想 3.非递归实现快排图解 4.完整代码 1.引入 递归不可避免的话题就是防止栈溢出 所以程序员需要具备递归改非递归的能力 &#xff0c;一般来说&#xff0c;抓住递归中变化的量是关键 void QuickSort(int* a, int left, int right){if (left…

CLAP文本-音频基础模型: LEARNING AUDIO CONCEPTS FROM NATURAL LANGUAGE SUPERVISION

一、TL&#xff1b;DR 现在的做法有什么问题&#xff1f;主流范式是 “一个类别标签对应多个录音”&#xff0c;需要提前标注预测预先定义的类别&#xff0c;只能做闭集理解&#xff0c;失去灵活性 我们怎么做&#xff1f;通过两个编码器和对比学习机制建立语言与音频的关联&a…

Flink2.0学习笔记:Stream API 常用转换算子

EC0720/FLINKTASK-TEST-STREAM/demo at master stevensu1/EC0720 先看测试效果&#xff1a;控制台 测试效果&#xff1a;监控服务端 主要的转换算子包括&#xff1a; 转换算子 filter:过滤包含“Flink”的输入 转换算子 map: 将每行数据前添加“Processed: ”并转为大写 转…

一、Python环境、Jupyter与Pycharm

安装Python由于RAG项目中所需要的Python版本必须高于3.8&#xff0c;经过筛选&#xff0c;最终选择了3.10.11这个版本py --version Python 3.10.11安装过程略过&#xff0c;但对于几个基础的命令作个笔记记录where python找到python启动器的位置D:\>where python C:\Users\x…

Flink CEP 动态模板与规则动态修改实践完全手册

1. Flink CEP:从静态规则到动态江湖 Flink 的复杂事件处理(CEP)库就像一个武功高强的侠客,能从数据流中精准捕获特定模式,堪称流处理界的“降龙十八掌”。但问题来了:传统 CEP 规则通常是写死在代码里的,就像刻在石碑上的武功秘籍,改起来费劲不说,还得重启应用,简直…

vue3.2 + echarts5.6 + ant-design-vue 3.x 实现自定义 echarts 图例

文章目录概要技术细节效果概要 需求需要实现图例移入显示描述说明 故实现自定义图例 技术细节 <template><div class"custom-legend"><divv-for"item in legends":key"item.name"class"legend-item":class"{ i…

【2025年7月25日】TrollStore巨魔商店恢复在线安装

就在今日7月25日&#xff0c;TrollStore的在线安装功能再次变得可用&#xff0c;这对于许多iPhone用户来说无疑是个喜讯。在经历了近三个月的中断后&#xff0c;巨魔商店的企业证书意外的到来了&#xff0c;使得用户能够重新采用在线安装的方式&#xff01; 在线安装地址在文…

【05】C#入门到精通——C# 面向对象、类、静态变量static、类与类之间的调用

文章目录1 引入例子2 创建类2.1 类的访问属性2.2 英雄 特点类2.3 英雄信息打印3 静态变量static4 类 调用 类4.1 非静态 成员函数4.2 静态 成员函数1 引入例子 比如游戏中 描述英雄的角色&#xff0c; 我们可以像下面这样&#xff0c;给每一个英雄特点及拥有技能分别定义变量…

单片机的硬件结构

单片机的硬件结构 一、课程导入 在上一节课《认识单片机》中&#xff0c;我们知道单片机就像一个超级迷你的工厂&#xff0c;有着类似工厂的各个组成部分。而这个 “迷你工厂” 能正常运转&#xff0c;离不开其内部严谨的硬件结构。就像一座大厦&#xff0c;只有基础结构稳固且…

multiprocessing模块使用方法(二)

spawn_main是Python multiprocessing模块的核心内部函数&#xff0c;用于实现spawn启动方法的子进程初始化。以下结合代码Demo详细说明其使用方法和推荐场景。一、spawn_main的功能与定位核心作用&#xff1a; 在spawn模式下启动子进程&#xff0c;负责进程间通信管道的建立和资…

编程与数学 03-002 计算机网络 07_路由算法

编程与数学 03-002 计算机网络 07_路由算法一、静态路由算法&#xff08;一&#xff09;手工配置路由表的方法&#xff08;二&#xff09;静态路由的优缺点二、动态路由算法原理&#xff08;一&#xff09;距离矢量算法&#xff08;如贝尔曼 - 福特算法&#xff09;&#xff08…

使用Python,OpenCV计算跑图的图像彩色度

使用Python&#xff0c;OpenCV计算跑图的图像彩色度 这篇博客将介绍如何计算跑图里最鲜艳的top25图片和最灰暗的top25图片并显示色彩彩色度值展示。 效果图 以下分别是最鲜艳top25和最灰暗top25对比效果图&#xff1a; 最鲜艳top25效果图&#xff1a; 最灰暗top25效果图…

LeetCode 60:排列序列

LeetCode 60&#xff1a;排列序列问题定义与核心挑战 给定整数 n 和 k&#xff0c;返回集合 {1,2,...,n} 的第 k 个字典序排列。直接生成所有排列再遍历到第 k 个的方法&#xff08;时间复杂度 O(n!)&#xff09;会因 n≥10 时阶乘爆炸而超时&#xff0c;因此需要 数学推导 贪…

亚远景-传统功能安全VS AI安全:ISO 8800填补的标准空白与实施难点

一、为什么需要ISO 8800&#xff1a;传统安全标准的“盲区”传统功能安全&#xff08;ISO 26262&#xff09;• 假设&#xff1a;系统行为可被完整规格化&#xff0c;失效模式可枚举&#xff0c;风险可用概率-危害矩阵量化。• 盲区&#xff1a;对“设计意图正确&#xff0c;但…

菜鸟教程 R语言基础运算 注释 和数据类型

菜鸟教程 R语言基础运算 注释 和数据类型 1.注释 注释主要用于一段代码的解析&#xff0c;可以让阅读者更易理解&#xff0c;编程语言的注释会被编译器忽略掉&#xff0c;且不会影响代码的执行。 一般编程语言的注释分为单行注释与多行注释&#xff0c;但是 R 语言只支持单行注…

华为云ELB(弹性负载均衡)持续报异常

华为云ELB&#xff08;弹性负载均衡&#xff09;持续报异常&#xff0c;需结合实例类型&#xff08;共享型/独享型&#xff09;和异常代码进行针对性排查。以下是分步排查建议&#xff1a;一、根据实例类型排查网络配置共享型实例 安全组规则&#xff1a;检查后端服务器安全组是…

《R for Data Science (2e)》免费中文翻译 (第2章) --- Workflow: basics

写在前面 本系列推文为《R for Data Science (2)》的中文翻译版本。所有内容都通过开源免费的方式上传至Github&#xff0c;欢迎大家参与贡献&#xff0c;详细信息见&#xff1a; Books-zh-cn 项目介绍&#xff1a; Books-zh-cn&#xff1a;开源免费的中文书籍社区 r4ds-zh-cn …