五、SpringIoC/DI的使用

1. 类注解、方法注解

告诉spring管理bean—>bean的存储
1、类注解:五大注解 @Controller(控制器存储)、 @Service(服务存储)、 @Repository(仓库存储)、 @Component(组件存储)、 @Configuration(配置存储) 
2、方法注解:@Bean, @Bean必须和类注解一起使用

2. 类注解、方法注解Bean名称命名规则

2.1. 五大类注解

a、默认类名首字母小写,如果前两位字母均为大写,则为原类名
b、也可以指定Bean的名称,指定方法例如:@Controller(“beanName”)

2.2  方法注解@Bean

默认名称:方法名
也可以指定名称:@Bean(“beanName”)、 @Bean({"u1","user1"})一个bean(对象)有两个名称

3. 启动类中获取bean的方式

3.1 由BeanFactory提供

ApplicationContext 继承了 BeanFactory, ApplicationContext的功能比 BeanFactory方法更多,更强大

扫描路径
spring默认扫描路径:是启动类所在路径
使用 @ComponentScan("包路径/类所在路径")就可以指定spring扫描路径

3.2 根据类型来获取bean

被spring管理的对象统称为bean:即bean指对象

3.3 根据名字来获取bean

spring帮我们创建对象,会给对象起名字
            如果未命名:spring会指定名称,类名首字母小写,小驼峰
                    未命名:如果类名前两位字母都是大写,Bean的名称为原始类名
为类添加注解后,未命名的类,spring会指定名字
获取bean名字为userService的类
(2)命名:注解(“名字”)
@Controller(“名字”)

4. IoC详细用法

4.1 五大注解

为什么要这么多类注解?当看到类注解之后,就能直接了解当前类的用途.
• @Controller:控制层,接收请求,对请求进⾏处理,并进行响应。除了具备让spring管理的功能外,还具备路由功能,接口入口必须要有@controller
• @Servie:业务逻辑层,处理具体的业务逻辑.
• @Repository:数据访问层,也称为持久层.负责数据访问操作
• @Configuration:配置层.处理项⽬中的⼀些配置信息
(1)@Controller(控制器存储)
(2)@Service(服务存储)
(3)@Repository(仓库存储)、
(4)@Component(组件存储)、
(5)@Configuration(配置存储)

4.2 方法注解@Bean

@Bean需要搭配五大注解使用,因为只有类被注解时,spring才会去扫描被注解的类
@Bean注解默认名字为原方法名

5. DI注入依赖

Ioc:存储对象,并对对象进行管理
DI:使用对象,将对象取出来使用

5.1 AutoWired属性注入

@Autowired
private UserService userService;
优点:
简洁,使⽤⽅便;
缺点:
只能⽤于IoC容器,如果是⾮IoC容器不可⽤,并且只有在使⽤的时候才会出现NPE(空指 针异常) 
不能注⼊⼀个Final修饰的属性

5.2 构造方法注入

public class UserController {private PeoService peoService;private UserService userService;public UserController() {}//此时只有该构造方法被初始化,userService对象被注入@Autowiredpublic UserController(UserService userService) {this.userService = userService;}public UserController(UserService userService,PeoService peoService) {this.userService = userService;this.peoService = peoService;
}
构造方法注入时,如果有多个构造函数,spring只能默认识别第一个构造方法。我们可以使用 @Autowired注解来帮助spring选择使用哪一个构造方法来注入对象
构造方法注入优点:
可以注入final修饰的属性
属性被final修饰时需要先被初始化
注入的对象不会被修改
依赖对象在使⽤前⼀定会被完全初始化,因为依赖是在类的构造方法中执行的,而构造方法是在类加载阶段就会执行的方法.
通用性好,构造方法是JDK支持的,所以更换任何框架,他都是适用的

5.3 set方法注入

@Controller
public class UserController3 { //注⼊⽅法3: Setter⽅法注⼊ private UserService userService; @Autowiredpublic void setUserService(UserService userService) { this.userService = userService;} public void sayHi(){ System.out.println("hi,UserController3..."); userService.sayHi(); } 
}

6. @Autowired存在问题

Autowired先根据名称获取对象,如果没有获取到就根据对象的类型来匹配
//创建两个对象
@Component
public class Autowired {@Bean("u1")public User user1(){User user = new User();user.setName("zhangsan");user.setAge(18);return user;}@Beanpublic User user2() {User user = new User();user.setName("lisi");user.setAge(19);return user;}
}//获取Bean(对象)
@Controller
public class UserController {@Autowiredprivate UserService userService;//注⼊user@Autowiredprivate User user;//此时这里会报错, @Autowired注解先根据bean名称来注入(获取)对象的,找不到的话就会根据类型来获取对象
//而这里User对象有两个,就不知道注入哪个对象所以会出现错误public void sayHi(){userService.sayHi();System.out.println(user);}

如何解决上面的问题?
@Primary
@Qualifier
@Resource
@Primary: 使⽤@Primary注解:当存在多个相同类型的Bean注⼊时,加上@Primary注解,来确定默认的实现
@Component
public class BeanConfig { @Primary //指定该bean为默认bean的实现 @Bean("u1")public User user1(){ User user = new User(); user.setName("zhangsan"); user.setAge(18); return user; } @Beanpublic User user2() { User user = new User(); user.setName("lisi"); user.setAge(19); return user;}
}

@Qualifier: 使⽤@Qualifier注解:指定当前要注⼊的bean对象。在@Qualifier的value属性中,指定注⼊的bean 的名称。
@Qualifier注解不能单独使⽤,必须配合@Autowired使⽤
@Controller
public class UserController { @Qualifier("user2") //指定bean名称 @Autowiredprivate User user;public void sayHi(){ System.out.println("hi,UserController..."); System.out.println(user); }}
使⽤@Resource注解:是按照bean的名称进行注入。通过name属性指定要注入的bean的名称
@Controller
public class UserController { @Resource(name = "user2")private User user; public void sayHi(){ System.out.println("hi,UserController..."); System.out.println(user); } 
}

常见面试题: @Autowird与@Resource的区别
@Autowired是spring框架提供的注解,⽽@Resource是JDK提供的注解
@Autowired默认是按照类型注⼊,⽽@Resource是按照名称注⼊.相⽐于@Autowired来说, @Resource⽀持更多的参数设置,例如name设置,根据名称获取Bean。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】管道通信和 system V 通信

文章目录 一、进程通信原理(让不同进程看到同一份资源)二、管道通信2.1 管道原理及其特点2.1 匿名管道和命名管道 三、共享内存通信3.1 共享内存原理3.2 创建和关联共享内存3.3 去关联、ipc 指令和删除共享内存 四、消息队列和信号量(了解&am…

VirtualSurveyor9.0.3 无人机测绘软件功能介绍

Virtual Surveyor9.0.3中文版是功能强大的无人机测绘软件,使用旨在为用户提供完整的地理空间数据可视化和分析功能,带来提高的生产力,功能全面而强大,在无人机到CAD模型的过程中,使用Virtual Surveyor软件来拆卸输送机…

情绪稳定的人有什么特点?

第一部分:至纯之人,大器晚成 1.1 单纯,不是天真 你知道吗?那些能够成就大事的人,往往在人性上非常单纯。他们对外界的需求很低,更多的是向内寻求。这样的人,他们的内心世界像一片净土&#xff…

数据结构与算法--顺序表(Java)

📝个人主页🌹:誓则盟约 ⏩收录专栏⏪:Java SE 🤡往期回顾🤡:Java SE--基本数据类型(详细讲解) 🌹🌹期待您的关注 🌹🌹 什么…

每日任务:TCP/IP模型和OSI模型的区别

介绍一下TCP/IP模型和OSI模型的区别? OSI模型由国标准化组织提出,而TCP/IP模型是由美国国防部开发的; OSI模型由七个层次组成,从下到上依次为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。而TCP/IP模型只有四层…

AI视频生成(即梦)

1.打开即梦网页版 https://jimeng.jianying.com/ai-tool/home 2.图片生成-导入参考图(这里原本的红色或者灰度图都是可以的)-精细度5(最高图质量越高) 注:根据需要,选择不同的生图模型,具有…

线上监控诊断 - Arthas

简介 Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并且能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,…

SAPUI5基础知识20 - 对话框和碎片(Dialogs and Fragments)

1. 背景 在 SAPUI5 中,Fragments 是一种轻量级的 UI 组件,类似于视图(Views),但它们没有自己的控制器(Controller)。Fragments 通常用于定义可以在多个视图中重用的 UI 片段,从而提…

项目实战1(30小时精通C++和外挂实战)

项目实战1(30小时精通C和外挂实战) 01-MFC1-图标02-MFC2-按钮、调试、打开网页05-MFC5-checkbox及按钮绑定对象06--文件格式、OD序列号08-暴力破解09-CE10-秒杀僵尸 01-MFC1-图标 这个外挂只针对植物大战僵尸游戏 开发这个外挂,首先要将界面…

FPGA:流水灯设计

本次基于FPGA实现流水灯,即让LED[0:7]从左到右依次电量,每个LED灯频闪周期为1s钟,在这里,给出下面三种实现思路: 1、实验思路 1、使用位运算符 在复位时令LED灯为LED8’b0000_0001,然后每过一秒钟&#x…

软考:软件设计师 — 7.软件工程

七. 软件工程 1. 软件工程概述 (1)软件生存周期 (2)软件过程 软件开发中所遵循的路线图称为 "软件过程"。 针对管理软件开发的整个过程,提出了两个模型:能力成熟度模型(CMM&#…

嵌入式C++、STM32、MySQL、GPS、InfluxDB和MQTT协议数据可视化:智能物流管理系统设计思路流程(附代码示例)

目录 项目概述 系统设计 硬件设计 软件设计 系统架构图 代码实现 1. STM32微控制器与传感器代码 代码讲解 2. MQTT Broker设置 3. 数据接收与处理 代码讲解 4. 数据存储与分析 5. 数据分析与可视化 代码讲解 6. 数据可视化 项目总结 项目概述 随着电子商务的快…

简单小案例分析

一、容器和实例关系 <div class"app"><h1>Hello,{{name}}</h1> </div> <div class"app"><h1>Hello,{{name}}</h1> </div><script>//创建Vue实例new Vue({el:".app", //el用于指定当前V…

暴风骑士S9电摩上市,定义青少年骑行安全新标准

暴风骑士&#xff0c;作为全球高端儿童电动车的开创品牌&#xff0c;以其卓越的技术实力和创新精神&#xff0c;不断推动行业发展。如今&#xff0c;暴风骑士再次突破自我&#xff0c;推出了全新力作——S9青少年电摩。这款全新上市的青少年专属电摩&#xff0c;以其领先的安全…

LCD 横屏切换为竖屏-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板

LCD 横屏切换为竖屏 横屏显示如何切换为竖屏显示 LCD 屏默认横屏显示 开发板配套的 LCD 屏默认都是横屏显示&#xff0c;如 4.3 寸、7 寸和 10.1 寸的不同分辨率的 RGB LCD 屏 固定坐标体系 &#xff08;以 800*480 分辨率为例&#xff09;横屏模式下的固定坐标&#xff1a;…

某数据泄露防护(DLP)系统NoticeAjax接口SQL注入漏洞复现 [附POC]

文章目录 某数据泄露防护(DLP)系统NoticeAjax接口SQL注入漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现某数据泄露防护(DLP)系统NoticeAjax接口SQL注入漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章内…

Vitis AI 使用 VAI_Q_PYTORCH 工具

目录 1. 简介 2. 资料汇总 3. 示例解释 3.1 快速上手示例 4. 总结 1. 简介 vai_q_pytorch 是 Vitis AI Quantizer for Pytorch 的缩写&#xff0c;主要作用是优化神经网络模型。它是 Vitis AI 平台的一部分&#xff0c;专注于神经网络的深度压缩。 vai_q_pytorch 的作用…

如何应对SQL注入攻击?

引言 在现今的网络世界中&#xff0c;安全性已成为至关重要的话题。SQL注入&#xff08;SQL Injection&#xff09;是一种常见且危险的网络攻击方式&#xff0c;攻击者通过向SQL查询中插入恶意代码来操控数据库&#xff0c;从而获取敏感信息或破坏数据。了解SQL注入的各种类型…

2024中国大学生算法设计超级联赛(2)

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;陈童学哦&#xff0c;彩笔ACMer一枚。 &#x1f3c0;所属专栏&#xff1a;杭电多校集训 本文用于记录回顾总结解题思路便于加深理解。 &#x1f4e2;&#x1f4e2;&#x1f4e2;传送门 A - 鸡爪解题思…

AI在Facebook的应用:预见智能化社交的新前景

在数字化时代&#xff0c;社交媒体平台已成为我们生活的重要组成部分&#xff0c;而人工智能&#xff08;AI&#xff09;的快速发展正推动着这些平台向更智能、更个性化的方向发展。Facebook&#xff0c;作为全球最大的社交网络平台之一&#xff0c;正不断探索和应用AI技术&…