Spring:注解开发依赖注入

Spring为了使用注解简化开发,并没有提供构造函数注入setter注入对应的注解,只提供了自动装配的注解实现。
直接上代码:

1,添加一个配置类`SpringConfig

@Configuration
@ComponentScan("com.itheima")
//@PropertySource加载properties配置文件
@PropertySource({"jdbc.properties"})
public class SpringConfig {
}

其中,@PropertySource加载properties配置文件

2,resource下准备properties文件

注解读取properties配置文件
@Value一般会被用在从properties配置文件中读取内容进行使用
jdbc.properties

name=itheima888

注意:

  • 如果读取的properties配置文件有多个,可以使用@PropertySource的属性来指定多个

    @PropertySource({"jdbc.properties","xxx.properties"})
    
  • @PropertySource注解属性中不支持使用通配符*,运行会报错

    @PropertySource({"*.properties"})
    
  • @PropertySource注解属性中可以把classpath:加上,代表从当前项目的根路径找文件

    @PropertySource({"classpath:jdbc.properties"})
    

2,添加BookDao、BookDaoImpl、BookService、BookServiceImpl类

public interface BookDao {public void save();
}@Repository("bookDao")
public class BookDaoImpl implements BookDao {//@Value:注入简单类型(无需提供set方法)@Value("${name}")private String name;public void save() {System.out.println("book dao save ..." + name);}
}@Repository("bookDao2")
public class BookDaoImpl2 implements BookDao {public void save() {System.out.println("book dao save ...2");}
}public interface BookService {public void save();
}@Service
public class BookServiceImpl implements BookService {//@Autowired:注入引用类型,自动装配模式,默认按类型装配@Autowired//@Qualifier:自动装配bean时按bean名称装配@Qualifier("bookDao")private BookDao bookDao;public void save() {System.out.println("book service save ...");bookDao.save();}
}

其中:

  • @Autowired可以写在属性上,也可也写在setter方法上,最简单的处理方式是写在属性上并将setter方法删除掉
  • @Value(“${name}”):注入简单类型(无需提供set方法)
  • @Autowired:注入引用类型,自动装配模式,默认按类型装配;
    如果IOC容器中同类的Bean找到多个,就按照变量名和Bean的名称匹配。
  • @Qualifier(“bookDao”):
    • 自动装配bean时按bean名称装配,@Qualifier注解后的值就是需要注入的bean的名称。
    • 当根据类型在容器中找到多个bean,注入参数的属性名又和容器中bean的名称不一致,此时需要用到@Qualifier(“bookDao”)来指定注入哪个名称的bean对象。
    • 如果不加Qualifier(“bookDao”),因为按照类型会找到多个bean对象,此时会按照bookDao名称去找,如果找不到,会报NoUniqueBeanDefinitionException
      注意:@Qualifier不能独立使用,必须和@Autowired一起使用

3,编写运行类

public class App {public static void main(String[] args) {AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);BookService bookService = ctx.getBean(BookService.class);BookService bookService2 = ctx.getBean(BookServiceImpl.class);bookService.save();bookService2.save();}
}

上述两个获取bean 的方式都可以

4,运行结果

在这里插入图片描述

发现bookDao、 @Value(“${name}”)都注入了

大总结

知识点1:@Autowired
名称@Autowired
类型属性注解 或 方法注解(了解) 或 方法形参注解(了解)
位置属性定义上方 或 标准set方法上方 或 类set方法上方 或 方法形参前面
作用为引用类型属性设置值
属性required:true/false,定义该属性是否允许为null
知识点2:@Qualifier
名称@Qualifier
类型属性注解 或 方法注解(了解)
位置属性定义上方 或 标准set方法上方 或 类set方法上方
作用为引用类型属性指定注入的beanId
属性value(默认):设置注入的beanId
知识点3:@Value
名称@Value
类型属性注解 或 方法注解(了解)
位置属性定义上方 或 标准set方法上方 或 类set方法上方
作用为 基本数据类型 或 字符串类型 属性设置值
属性value(默认):要注入的属性值
知识点4:@PropertySource
名称@PropertySource
类型类注解
位置类定义上方
作用加载properties文件中的属性值
属性value(默认):设置加载的properties文件对应的文件名或文件名组成的数组

思考:

  • 上述app中,BookService bookService = ctx.getBean(BookService.class) 获取bean是按照类型BookService获取,但是实际获取的是BookServiceImpl类型对象;因此写成BookService bookService2 = ctx.getBean(BookServiceImpl.class);也能获取到对象
  • 如果再写一个类来实现BookService的话,BookService bookService = ctx.getBean(BookService.class)会找到两个bean对象,因此会报错:```
Exception in thread "main" org.springframework.beans.factory.NoUniqueBeanDefinitionException: 
No qualifying bean of type 'com.itheima.service.BookService' available:expected single matching bean but found 2: bookServiceImpl,bs2
  • 可以使用BookService bookService3 = ctx.getBean(BookServiceImpl2.class)获取bean
  • 也可以使用名称注解后,使用名称获取,但需要转型:BookService bookService4 = (BookService) ctx.getBean(“bs2”);
    *或者BookService bookService5 = (BookServiceImpl2) ctx.getBean(“bs2”);

代码:BookServiceImpl2类

@Service("bs2")
public class BookServiceImpl2 implements BookService {//@Autowired:注入引用类型,自动装配模式,默认按类型装配@Autowired//@Qualifier:自动装配bean时按bean名称装配@Qualifier("bookDao")private BookDao bookDao;public void save() {System.out.println("book service33 save ...");bookDao.save();}
}

app应用类:

public class App {public static void main(String[] args) {AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);//BookService bookService = ctx.getBean(BookService.class);BookService bookService2 = ctx.getBean(BookServiceImpl.class);BookService bookService3 = ctx.getBean(BookServiceImpl2.class);BookService bookService4 = (BookService) ctx.getBean("bs2");BookService bookService5 = (BookServiceImpl2) ctx.getBean("bs2");//bookService.save();bookService2.save();bookService3.save();bookService4.save();bookService5.save();}
}

运行结果:
在这里插入图片描述
由此得出:个人感觉还是需要名称注解比较合适

[说明]:内容主要来源黑马程序员网上资源学习

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

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

相关文章

springboot006基于SpringBoot的网上订餐系统(源码+包运行+LW+技术指导)

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…

【Linux】learning notes(2)

文章目录 1、快捷键2、专业名词2.1、驱动2.2、内核2.3、U-Boot2.4、Dynamic Library and Static Library2.5、SDK / NDK / UDK 3、BUG 前文链接: 【Linux】learning notes 1、快捷键 在文件夹里,ctrll,选定文件夹路径 Linux下的ctrl常用组合…

商业银行核心系统单元化改造的研究与思考

随着金融科技的快速发展,银行核心系统面临着更高的处理能力、扩展能力及业务连续性的要求与挑战。为应对这些挑战,许多银行开始考虑对其核心系统进行单元化改造。本文首先分析了传统银行核心系统存在的问题以及单元化改造的必要性,然后详细阐…

指针

内存和地址 内存 我们知道计算上CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的数据也会放回内存中,那我们电脑上的哪些内存空间如何高效的管理呢? 其实也是把内存划分为一个个的…

强大的正则表达式——Medium

由上一篇文章《Easy》中提到过的: 还是直接让AI写个python脚本生成难度2的正则表达式,但是生成的正则表达式无法成功获取到flag: 这里了解了一下相关知识,字符串形式的整数对常数求模是可以用有限状态机来实现的。对于二进制数字来…

科技改变工作方式:群晖NAS安装内网穿透实现个性化办公office文档分享(1)

文章目录 前言1. 本地环境配置2. 制作本地分享链接3. 制作公网访问链接4. 公网ip地址访问您的分享相册5. 制作固定公网访问链接 前言 本文将详细介绍如何在群晖NAS上安装Synology Office和Synology Drive Server,并利用Cpolar内网穿透工具为本地文档配置固定的公网…

android:taskAffinity 对Activity退出时跳转的影响

android:taskAffinity 对Activity跳转的影响 概述taskAffinity 的工作机制taskAffinity对 Activity 跳转的影响一个实际的开发问题总结参考 概述 在 Android 开发中,任务栈(Task)是一个核心概念。它决定了应用程序的 Activity 如何相互交互以…

运算放大器的学习(三)增益带宽积

我们接着了解运放的相关指标参数,下面我们看下增益带宽积与压摆率. 增益带宽积:即电压增益(Gain)和带宽(Bandwidth)的乘积是一个常数,称为增益带宽积(Gain Bandwidth Product). 增益…

ThinkPHP6门面(Facade)

门面 门面(Facade) 门面为容器中的(动态)类提供了一个静态调用接口,相比于传统的静态方法调用, 带来了更好的可测试性和扩展性,你可以为任何的非静态类库定义一个facade类。 系统已经为大部分…

【概率论】概率密度到底是什么

1. 书本上的定义: 如果对于随机变量X的分布函数F(X),存在一个非负可积函数f(x),使得任意实数x,都有: 称X为连续型随机变量,函数f(x)称为X的概率密度 所谓的概率密度,就是 概率/区间长度 &#…

线代笔记期末复习

第一讲行列式的计算 基础定义和规则 ps: 交换时不止行可以交换,列方便时也可以 我的第一作法:是把行相加,然后后续无差别 范德蒙行列式的计算: 要求第一行/列全为1 每个公比元素作差再相乘 爪型 步骤:…

javaweb快速入门 - 01

1.基本概念 web开发: web,网页的意思 , www.baidu.com静态web html,css提供给所有人看的数据始终不会发生变化! 动态web 淘宝,几乎是所有的网站;提供给所有人看的数据始终会发生变化&#xf…

计算机网络学习笔记-6.应用层

文章目录 客户端-服务器模型(C/S)对等网络模型(P2P)DNS(域名系统)文件传输协议(FTP)FTP的基本功能:FTP的工作原理: 万维网(WWW)URL万维…

使用IDE实现java端远程调试功能

使用IDE实现java端远程调试功能 1. 整体描述2. 前期准备3. 具体操作3.1 修改启动命令3.2 IDE配置3.3 打断点3.4 运行Debug 4. 总结 1. 整体描述 在做项目时,有些时候,需要和第三方进行调式,但是第三方不在一起,需要进行远程调试&…

241118学习日志——[CSDIY] [InternStudio] 大模型训练营 [07]

CSDIY:这是一个非科班学生的努力之路,从今天开始这个系列会长期更新,(最好做到日更),我会慢慢把自己目前对CS的努力逐一上传,帮助那些和我一样有着梦想的玩家取得胜利!!&…

简单爬虫的实现

以下是一个简单爬虫代码的实现: import requests from bs4 import BeautifulSoup# 生成一个包含多个网页 URL 的列表 # 这里我们构造了 50 个页面的 URL,假设网站有多页内容,页数从 1 到 50 urls [f"https://www.cnblogs.com/#p{i}&qu…

RNN简单理解;为什么出现Transformer:传统RNN的问题;Attention(注意力机制)和Self-Attention(自注意力机制)区别;

目录 RNN简单理解 RNN n to n Transformer N to M LSTM 为什么出现Transformer:传统RNN的问题 信息丢失的后果 Rnn是顺序执行的效率不高:顺序执行 Attention(注意力机制)和Self-Attention(自注意力机制)区别 一、计算对象不同 二、应用场景不同 三、功能差异…

小熊派Nano|HarmonyOS初体验-LiteOS内核

在这个万物互联的时代,操作系统作为连接硬件与应用的桥梁,其重要性不言而喻。华为推出的HarmonyOS(鸿蒙操作系统),自诞生以来便备受瞩目,它不仅承载着华为对未来智能生态的愿景,更以其独特的分布…

Linux基础(二十一)——认识系统服务(daemons)

认识系统服务 ( daemons) 1.daemon 与服务 ( service)2. systemd3. systemctl4. systemctl 配置文件 1.daemon 与服务 ( service) 在 Linux 和类 Unix 系统中,daemon(守护进程&…

QT QChart+Eigen库绘制线性回归散点图

QChart+Eigen库绘制线性回归散点图 老套路,一图胜千言 项目结构 代码 mainwindow.h #ifndef MAINWINDOW_H #