五、SpringIoC/DI的使用

news2024/9/8 23:30:46

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对象被注入
    @Autowired
    public 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; 

    @Autowired
    public 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;
    }

    @Bean
    public User user2() {
        User user = new User();
        user.setName("lisi");
        user.setAge(19);
        return user;
    }
}


//获取Bean(对象)
@Controller
public class UserController {
    @Autowired
    private UserService userService;

    //注⼊user
    @Autowired
    private 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; } 

    @Bean
    public 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名称 
     @Autowired
     private 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://www.coloradmin.cn/o/1957891.html

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

相关文章

一种多策略改进黑翅鸢智能优化算法IBKA(2024年新出优化算法)种群初始化精英反向+透镜成像反向学习+黄金正弦变异策略

一种多策略改进黑翅鸢智能优化算法IBKA(2024年新出优化算法) 种群初始化精英反向策略透镜成像反向学习策略黄金正弦变异策略 文章目录 前言一种多策略改进黑翅鸢智能优化算法IBKA(2024年新出优化算法) 种群初始化精英反向策略透镜…

35_YOLOX网络详解

1.1 简介 YOLOX是YOLO系列(You Only Look Once)目标检测模型的一个最新变种,由阿里云团队和旷视科技在2021年提出。YOLO系列以其快速、准确的目标检测能力而闻名,而YOLOX在此基础上进行了多方面的改进和优化,旨在提供…

获取手机当前信号强度(dbm/asu值)解决 getGsmSignalStrength()总是返回99问题

能看到这篇文章说明网上哪些获取 (dbm/asu值)不适合你,不是他们的代码不正确,而是不符合你的情况 比如安卓6获取android手机信号强度 可以看这篇文章 https://blog.csdn.net/sinat_31057219/article/details/81134030 当然如果你…

计算机三级嵌入式(三)——嵌入式系统硬件组成

目录 考点1 嵌入式最小硬件系统 考点2 基于 ARM 内核的典型嵌入式应用系统硬件组成 考点3 ARM 的 AMBA 总线体系结构及标准 考点4 基于 ARM 内核的嵌入式芯片的硬件组成 考点5 存储器层次结构 考点6 存储器分类 考点7 存储器主要性能指标 考点8 片内存储器 考点9 外部…

Perfectly Clear WorkBench中文绿色版,让每一张照片都完美无瑕

软件简介 你是否曾经为了一张不完美的照片而感到遗憾?是否曾经因为照片中的小瑕疵而不得不花费大量时间进行后期处理?现在,有了Perfectly Clear WorkBench,这些问题都将迎刃而解。作为全球领先的智能图像校正技术商推出的图像清晰…

【C++高阶数据结构】红黑树:全面剖析与深度学习

目录 🚀 前言:红黑树与AVL树的比较一: 🔥 红黑树的概念二: 🔥 红黑树的性质 三: 🔥 红黑树节点的定义和结构🚀 3.1 基本元素🚀 3.2 节点颜色🚀 3.…

Java中static静态变量--继承等相关知识

目录 static 继承: 继承的特点: 案例:自己设计一个继承体系练习: 设计思想: 代码: 子类到底能继承父类的哪些类容? 成员变量内存的继承情况: 成员方法的内存继承情况&#x…

项目经理的开源工具指南:优化您的选择过程

国内外主流的10款开源项目管理系统对比:PingCode、Worktile、禅道、Teambition、Gogs、码云 Gitee、Jira、Redmine、ProjectLibre、OpenProject。 在选择合适的开源项目管理系统时,很多团队面临诸多挑战:功能是否全面?易用性如何&…

C++初学(7)

7.1、字符串 字符串是存储在内存的连续字节中的一系列字符。C处理字符串的方式有两种,第一种是来自C语言,常被称为C风格字符串,另一种则是基于string类库的方法。 存储在连续字节中的一系列字符意味着可以将字符存储在char数组中&#xff0…

Mecanim Animation System

动画系统简介 Unity 有一个非常丰富而又复杂的动画系统,官方称其为Mecanim。该系统具有以下功能: 支持从外部导入动画剪辑,如:fbx、mb | ma(Autodesk maya 原件)、.max(3ds Max原件&#xff09…

5.仓颉编程_数组使用与异常捕捉

5.仓颉编程_数组使用与异常捕捉 数字数组与字符串数组 import std.console.*main() {var qty 10var zero2 0var array [1,2,3] //数组var str_arr:Array<String> [aa,bb]try {//qty qty / zero2//println(qty)println(str_arr[0])println(array[0])// println(arr…

rhce THE homework of first

ssh远程免密登录成功 下载httpd和nginx 关闭防火墙 查看selinux的状态 为服务器配置ip 填充网站的内容 添加服务器配置 将文本写入网站

2024电赛H题参考方案(+视频演示)——自动行使小车

目录 一、题目要求 二、参考资源获取 三、参考方案 1、环境搭建及工程移植 2、移植MPU6050模块 3、移植TB6612电机驱动模块 4、整体控制方案视频演示 总结 一、题目要求 小编自认为&#xff1a;此次H题属于控制类题目&#xff0c;相较于往年较为简单&#xff0c;功能也算单一&a…

深入解析 GZIP 压缩传输:优化网络性能的利器

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119@qq.com] 📱个人微信:15279484656 🌐个人导航网站:www.forff.top 💡座右铭:总有人要赢。为什么不能是我呢? 专栏导…

MATLAB中“varargin”的作用

varargin是什么&#xff1f; 在MATLAB中&#xff0c;varargin是一个特殊的变量&#xff0c;用于接收函数输入参数中的可变数量的参数。它允许用户在调用函数时传递不确定数量的参数。 varargin的本质是一个包含了所有可变参数的cell数组。在函数内部&#xff0c;可以使用cell…

dpdk 响应icmp请求(Echo or Echo Reply Message)

注&#xff1a;对于"Echo or Echo Reply Message"类型的icmp报文&#xff0c;响应报文的Identiy和Sequence Number的值与请求报文的这两个字段的值要相同。 Identifier&#xff08;标识符&#xff09;字段通常由发送方设置&#xff0c;并被用于将ICMP请求与相应的回复…

Lombok注解之@SneakyThrows作用

Lombok注解之SneakyThrows作用 读法 [ˈsniːki] [θroʊz] 悄悄的 抛出顾名思义&#xff0c;它能够自动偷摸的为咱们的代码生成一个try…catch块&#xff0c;并把异常向上抛出来。 使用 SneakyThrows的使用范围&#xff1a; 只能作用在方法和构造函数之上。从源码就可以…

【C++】选择结构-多条件if语句

多条件if语句格式为 if(第一个条件) else if(若第一个条件未满足&#xff0c;执行此条件) {第二个条件满足执行此操作} else if(若第二个条件未满足&#xff0c;执行此条件) {第三个条件满足执行此操作} ...... else{若所有条件都不满足执行此操作} 下面是一个实例 #inc…

app逆向实战:某咨询6.0.4.4版本signature等参数抓包与破解

本篇博客旨在记录学习过程&#xff0c;不可用于商用等其它途径 入口 密码登录接口 抓包 根据抓包结果得知动态参数是client_timestamp&#xff0c;keyword&#xff0c;client_session&#xff0c;sig&#xff0c;sigTime&#xff0c;cursor 初步观察得出以下结论&#xff…

负债了,打死也别干的六件事!逾期了,六句谎言千万别信!

负债这事儿&#xff0c;真是一言难尽&#xff0c;稍不留神&#xff0c;就可能让情况雪上加霜。今儿咱们聊聊&#xff0c;负债后那几件打死也别干的几件事&#xff0c;尤其是针对还没有逾期的朋友们&#xff0c;免得后悔莫及。 首先&#xff0c;千万别动歪脑筋&#xff0c;拿公款…