Spring ( 四 ) 注解注入

news2025/6/25 9:33:53

3.2.注解方式

目前 主流的方式 是使用注解方式来实现IoC效果.

在这里插入图片描述

3.2.1.配置类

config包下增加 SpringConfig 配置类

@Configuration 声明当前类为配置类, SpringIoC容器会根据配置类信息进行配置

@ComponentScan() bean扫描路径 , SpringIoC容器只维护 声明的路径下的增加"组件注解"的类

如果没有指定具体的路径 , SpringIoC容器 扫描@ComponentScan注解的类所在的包及其子包

package com.yuan.spring.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan("com.yuan.spring.beans")
public class SpringConfig {
}

3.2.2.组件注解

@Component , @Controller , @Service , @Repository 作用是一样的

加载在类上, 如果类在@ComponentScan 声明的扫描路径上, 将会被SpringIoC容器扫描到

@Component
public class HouWang {
	...
}

3.2.3.基于配置类的IoC容器

在这里插入图片描述

// 基于配置类创建	IoC容器	
AbstractApplicationContext beanFactory = new AnnotationConfigApplicationContext(SpringConfig.class);
// 得 bean的实例
HouWang houWang = beanFactory.getBean(HouWang.class);

3.2.4.注入简单值

在私有属性上使用 @Value 为属性赋值 , 属性的setter/getter方法可以去掉

	@Value("齐天大圣")
	private String mingZi;

	public void daZhaoHu() {
		System.out.println("大家好,我是" + this.mingZi);
	}

	//public String getMingZi() {
	//	return mingZi;
	//}
	//
	//public void setMingZi(String mingZi) {
	//	this.mingZi = mingZi;
	//}

调用方法测试

// 基于配置类创建	IoC容器	
AbstractApplicationContext beanFactory = new AnnotationConfigApplicationContext(SpringConfig.class);
// 得 bean的实例
HouWang houWang = beanFactory.getBean(HouWang.class);
// 调用 打招呼的方法
houWang.daZhaoHu();

3.2.5.注入对象类型

Spring使用 @Autowired@Resource 注解标记依赖项,并自动解析和注入它们。

3.2.5.1.@Autowired 注入

TieShanGongZhu 铁扇公主 类 上增加@Component注解,

注册到SpringIoC容器上, 由SpringIoC容器来实例化

@Component
public class TieShanGongZhu implements IYaoGuai {
	...
}

再修改 HouWang 猴王类 , 在 IYaoGuai 属性增加 @Autowired 注解

	@Autowired
	private IYaoGuai yg;

	//public IYaoGuai getYg() {
	//	return yg;
	//}
	//
	//public void setYg(IYaoGuai yg) {
	//	this.yg = yg;
	//}

	public void daYaoGuai() {
		//TieShanGongZhu yg = new TieShanGongZhu();
		yg.beiDa();
	}

测试

// 基于配置类创建	IoC容器	
AbstractApplicationContext beanFactory = new AnnotationConfigApplicationContext(SpringConfig.class);
// 得 bean的实例
HouWang houWang = beanFactory.getBean(HouWang.class);
// 调用 打妖怪方法
houWang.daYaoGuai();

得到 结果, 说明 通过@Autowired 将 TieShanGongZhu 铁扇公主 类 的实例注入到 HouWang 猴王类

石破天惊
我是公主!
臭猴子,肚子疼!

3.2.5.2.多个匹配出现冲突

NiuMoWang 牛魔王 类 增加@Component注解,

注册到SpringIoC容器上, 由SpringIoC容器来实例化

@Component
public class NiuMoWang implements IYaoGuai  {
	...
}

这样 就有 NiuMoWang 牛魔王 类 , TieShanGongZhu 铁扇公主 类 都满足 HouWang 猴王类 的注入要求

两个类都是 IYaoGuai 妖怪接口 的实现类, SpringIoC容器会注入哪个呢?

运行测试 ,

Exception in thread "main" org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'houWang': Unsatisfied dependency expressed through field 'yg'; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.yuan.spring.beans.IYaoGuai' available: expected single matching bean but found 2: niuMoWang,tieShanGongZhu

报错 : 预计单一匹配, 但找到了2个 : niuMoWang , tieShanGongZhu

说明 @Autowired 是按照类型进行匹配的

同时, SpringIoC容器在实例化对象时, 分别给类的实例起别名niuMoWang , tieShanGongZhu ( 类名首字母小写 )

有以下几种解决方案:

  1. 修改类实例的别名 , 在@Component(“别名”) , 这里的别名与注入的变量名相同 如: “yg”
  2. 直接修改应用类中需要注入的变量名与要注入的实例的默认别名相同
  3. 在变量名上增加 @Qualifier(“niuMoWang”) 与注入的实例的默认别名相同
  4. 可以使用 @Resource(name = “niuMoWang”) 来替换 @Autowired

3.2.5.3.@Autowired 与 @Resource

@Autowired@Resource 都是用于进行依赖注入的注解,但它们的具体使用有一些不同。

@Autowired 是 Spring 框架的注解,可以自动装配一个 bean 到使用它的类中。Spring 在容器启动时,自动扫描类路径中的组件(带有 @Component 或其它特定注解的类),并为其创建 bean。如果有多个 bean 满足装配的需求,可以通过指定 Qualifier 或者通过 Primary 注解来进行区分。

@Resource 是 Java 的标准注解,可以标注在属性、方法或构造函数上,指定需要装配的 bean 名称作为参数。如果没有指定名称,则会使用默认规则查找匹配的 bean。需要注意的是,@Resource 不支持 Qualifier 和 Primary 注解。

综上所述,@Autowired 更为灵活,支持 Qualifier 和 Primary 注解,适用于大部分情况下的依赖注入。@Resource 则更为简单,适用于只有一个符合条件的 bean 需要装配的情况。

3.2.6.@Bean声明注册

在 Spring 框架中,使用 @Bean 注解可以将某个方法的返回值注入到容器中,使之成为一个可被管理的 bean。

具体使用方式如下:

  1. 在 Java 配置类中,使用 @Configuration 注解,声明一个类为配置类。
  2. 在该类中,使用 @Bean 注解,声明一个方法为 Bean 方法,并在该方法中返回一个实例。
  3. 然后,Spring 容器会自动扫描该配置类,将其加载到 ApplicationContext 容器中,并在需要的时候使用该 Bean。

下面是一个简单的示例代码,展示了如何使用 @Bean 注解:

package com.yuan.spring.config;

import com.yuan.spring.beans.HongHair;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan("com.yuan.spring.beans")
public class SpringConfig {

    @Bean("hongHair")
    public HongHair getHongHair(){
        return new HongHair();
    }
}

需要注意的是,@Bean 注解有许多属性,可以用来定义 Bean 的各种属性,比如名称、作用域、依赖等等。此外,若多处出现名称相同的 bean,需要使用 @Qualifier@Primary 注解来指定要注入的 bean。

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

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

相关文章

华为OD机试真题 Java 实现【最多提取子串数目】【2023Q1 100分】

一、题目描述 给定由[a-z] 26 个英文小写字母组成的字符串 A和 B,其中A中可能存在重复字母,B 中不会存在重复字母,现从字符串 A 中按规则挑选一些字母,可以组成字符串 B。 挑选规则如下: 同一个位置的字母只能被挑选一次&#…

Qt连接Sqlite3并使用Qtableview实时显示数据,重写QSqlQueryModel实现文本居中

文章目录 前言一、引入SQL模块二、数据库的基本操作三、示例完整代码四、下载链接总结 前言 什么是 SQLite? SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其…

软件 工程

目录 第十章、软件工程1、瀑布模型(SDLC)2、快速原型模型3、增量模型4、螺旋模型5、Ⅴ模型6、喷泉模型7、构建组装模型(CBSD)8、统一过程(RUP)9、敏捷开发方法10、信息系统开发方法11、需求开发12、结构化设…

Codeforces Round 872 (Div. 2) 题解

总结:5.9有同学问B题,所以就连同ABC题一起做了,都算是思维题吧,难度不算高 A. LuoTianyi and the Palindrome String 思路:输入的都为回文字符串,如果输入的回文字符串每个字符都相同,如"…

QT+VS推箱子小游戏

1、创建一个GUI程序,将界面设计成如下样式: 创建一个已QDialog为基类的子类,在窗体里添加一个pushbutton的按钮,一个QLabel用来显示文字。窗体的背景图片和按钮的背景颜色,都可以在样式中进行设计。 2、右键项目名称&…

ChatGPT 实现云原生转型

云原生转型 在相对专业的细分领域,chatGPT 能起到什么作用呢?能给出什么回答,怎么问才能得到好的回答呢?本节内容,将尝试从一个业界其实也还没有定论的话题,开始问答。这就是:云原生转型。 &q…

OpenCV教程——图像模糊。均值模糊,高斯模糊,中值模糊,双边模糊,高斯分布

1.图像模糊 图像模糊是图像处理中最简单和常用的操作之一。 ⚠️使用该操作的原因之一是为了给图像预处理时降低噪声。 图像模糊操作背后是数学的卷积计算。 卷积操作的原理: 常用的图像模糊的方法: 均值模糊高斯模糊中值模糊双边模糊 这四种模糊方式…

商用密码应用安全性测评机构资质流程

商用密码应用安全性测评机构(简称密评机构)资质建设相关指导性材料包括: 1、《商用密码应用安全性测评机构能力要求》 2、《商用密码应用安全性测评机构能力评审实施细则(试行)》 3、《商用密码应用安全性测评机构管理…

【Rust】速度入门---打印个螃蟹先

参考: 菜鸟教程 1 输出到命令行 这不得打印个螃蟹 // 代码来自官方入门教程 // ferris_say需要另外安装 use ferris_says::say; use std::io::{stdout, BufWriter};fn main() {let stdout: std::io::Stdout stdout();let msg: String String::from("Hello fellow Rusta…

无线传感器网络的Z-SEP路由协议及对比(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 无线传感网络最早应用于军事领域,随着工业界和学术界的关注度提高和技术的成熟,现已广泛应用于军事侦查…

kubernetes❀集群环境搭建

kubernetes❀集群环境搭建 2. kubernetes集群环境搭建2.1 前置知识点2.2 kubeadm 部署方式介绍2.3 安装要求2.4 最终目标2.5 准备环境2.6 环境初始化2.6.1 检查操作系统的版本2.6.2 主机名解析2.6.3 时间同步2.6.4 禁用iptable和firewalld服务2.6.5 禁用selinux2.6.6 禁用swap分…

Rust Wasm Linux开发环境搭建

一、Linux 镜像版本 CentOS-7-x86_64-DVD-2009.iso,Virtual Box 7.0 选择 GNOME Desktop 版本, 配置远程连接(可选), nmtui 激活连接 enp0s3 ,查看 ip 地址, 绑定端口转发, 通过…

gateway与zuul的区别与联系

前言 zuul1.0与spring-cloud-gateway的区别 Zuul: zuul是netflix公司的项目,本质上是web servlet,基于JavaEE Servlet技术栈,使用阻塞API,处理的是http请求,没有提供异步支持,不支持任何长连接&#xff0c…

Linux——进程信号3

内核如何实现信号的捕捉 信号捕捉的方法出了我们之前的signal之外,还有其它方法 sigaction sigaction:检查或更改一个信号的动作即捕捉信号 第一个参数,要捕捉的信号对应的编号,第二个参数:结构体(这个结构…

4种整流电路、5种滤波电路

目录 基本电路变压电路整流电路半波整流电路全波整流电路桥式整流电路倍压整流电路 滤波电路电容滤波电路电感滤波电路RC滤波电路LC滤波电路有源滤波电路 整流滤波电路总结常用整流电路性能对照常用无源滤波电路性能对照电容滤波电路输出电流大小与滤波电容量的关系常用整流滤波…

nodejs+vue大学招聘求职网站

该系统的基本功能包括学生注册登录,企业注册登录,发布个人简历,发布企业招聘信息,新闻资讯,招聘信息,企业管理,学生信息管理,招聘信息管理,修改密码等功能。 系统首页 后台界面 1.…

【设计模式】设计模式简述及类图

设计模式的分类依据两个准则,第一个是目的准则,即模式是用来完成什么工作的。模式依据其目的可以分为创建型、结构型和行为型三种。创建型模式和对象的创建有关,结构型模式处理类或对象的组合。行为型模式对类或对象怎样交互和怎样分配职责进…

随机变量X,分布函数X~F(x)的理解。

1.随机变量X 1.通常认知的"x"与随机变量X 我们通常意义上的 x 是自变量,y f(x) 中的自变量。 但是 X 更多意义是 对应法则 " f " ,X完整写法是 X(ω) ω ∈ Ω。 X这个对应法则,可以将样本点映射到实数轴上。 那么X这…

初识linux之POSIX信号量

目录 一、信号量的概念 1. 信号量的作用 2. 信号量的PV操作 3. 信号量操作接口 3.1 初始化信号量 3.2 销毁信号量 3.3 等待信号量(P操作) 3.4 发布信号量(V操作) 二、循环队列 三、使用循环队列模拟实现生产消费模型 1…

Spring 组成及拓展

1. Spring 组成 1.1 Spring的七大模块 1.2拓展 在Spring官网有这个介绍:现代化的Java开发!说白了就是基于Spring的开发 - SpringBoot - 一个快速开发的脚手架 - 基于SpringBoot可以快速的开发单个微服务。 - 约定大于配置! - SpringC…