Spring-2-深入理解Spring 注解依赖注入(DI):简化Java应用程序开发

今日目标

 

掌握纯注解开发依赖注入(DI)模式

学习使用纯注解进行第三方Bean注入

1 注解开发依赖注入(DI)【重点】

问题导入

思考:如何使用注解方式将Bean对象注入到类中

1.1 使用@Autowired注解开启自动装配模式(按类型)

@Service
public class StudentServiceImpl implements StudentService {//创建成员对象//@Autowired:注入引用类型,自动装配模式,默认按类型装配@Autowiredprivate StudentDao studentDao ;@Overridepublic void save() {System.out.println("Service: 添加学生信息到数据库...");studentDao.save();}
}

说明:不管是使用配置文件还是配置类,都必须进行对应的Spring注解包扫描才可以使用。@Autowired默认按照类型自动装配,如果IoC容器中同类的Bean有多个,那么默认按照变量名和Bean的名称匹配,建议使用@Qualifier注解指定要装配的bean名称

注意:自动装配基于反射设计创建对象并暴力反射对应属性为私有属性初始化数据,因此无需提供setter方法。

1.2 使用@Qualifier注解指定要装配的bean名称

目的:解决IoC容器中同类型Bean有多个装配哪一个的问题

@Service
public class StudentServiceImpl implements StudentService {//创建成员对象//@Autowired:注入引用类型,自动装配模式,默认按类型装配@Autowired//@Qualifier:自动装配bean时按bean名称装配@Qualifier("studentDaoImpl")private StudentDao studentDao ;@Overridepublic void save() {System.out.println("Service: 添加学生信息到数据库...");studentDao.save();}
}

注意:@Qualifier注解无法单独使用,必须配合@Autowired注解使用

1.3 使用@Value实现简单类型注入

@Repository
public class StudentDaoImpl implements StudentDao {//@Value:注入简单类型(无需提供set方法)@Value("${test.name}")private String name;@Overridepublic void save() {System.out.println("DAO: name= "+name);System.out.println("DAO: 添加学生信息到数据库...");}
}

以上@Value注解中使用${test.name}从属性文件中读取test.name值,那么就需要在配置类或者配置文件中加载属性文件。

@Configuration
@ComponentScan("com.itheima")
//@PropertySource加载properties配置文件
@PropertySource("classpath:test.properties") //如果是多个属性文件,则使用{}数组
public class SpringConfig {
}

注意:@PropertySource中加载多文件请使用数组格式配置,不允许使用通配符*

2 注解开发管理第三方Bean【重点】

问题导入

思考:导入自己定义的配置类有几种方式?

【第零步】pom.xml添加数据库依赖

<!-- mysql 驱动-->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.30</version>
</dependency>
<!--druid包-->
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.18</version>
</dependency>

【第一步】单独定义配置类在config包下创建

package com.zbbmeta.config;import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;import javax.sql.DataSource;public class JdbcConfig {//@Bean:表示当前方法的返回值是一个bean对象,添加到IOC容器中@Beanpublic DataSource dataSource(){DruidDataSource ds = new DruidDataSource();ds.setDriverClassName("com.mysql.cj.jdbc.Driver");ds.setUrl("jdbc:mysql://localhost:3306/spring_druid");ds.setUsername("root");ds.setPassword("root");return ds;}
}

【第二步】将独立的配置类加入核心配置

方式1:@Import注解导入式

@Configuration // 指定这个类为配置类,替代application.xml
@ComponentScan("com.zbbmeta")//代替<context:component-scan base-package="com.zbbmeta" />
@PropertySource("classpath:test.properties") //如果是多个属性文件,则使用{}数组
@Import(JdbcConfig.class)  //加载JdbcConfig配置类
public class SpringConfig {}

方式2:@ComponentScan扫描式

  • JdbcConfig类上添加注解

@Configuration
public class JdbcConfig {//@Bean:表示当前方法的返回值是一个bean对象,添加到IOC容器中@Beanpublic DataSource dataSource(){DruidDataSource ds = new DruidDataSource();ds.setDriverClassName("com.mysql.cj.jdbc.Driver");ds.setUrl("jdbc:mysql://localhost:3306/spring_druid");ds.setUsername("root");ds.setPassword("root");return ds;}
}
  • SpringConfig配置不变

@Configuration // 指定这个类为配置类,替代application.xml
@ComponentScan("com.zbbmeta")//代替<context:component-scan base-package="com.zbbmeta" />
@PropertySource("classpath:test.properties") //如果是多个属性文件,则使用{}数组
//@Import(JdbcConfig.class)  //加载JdbcConfig配置类
public class SpringConfig {}

3 注解开发为第三方Bean注入资源【重点】

问题导入

思考:配置类中如何注入简单类型数据,如何注入引用类型数据?

3.1 简单类型依赖注入

public class JdbcConfig {@Value("com.mysql.jdbc.Driver")private String driver;@Value("jdbc:mysql://localhost:3306/spring_db")private String url;@Value("root")private String userName;@Value("root")private String password;//1.定义一个方法获得要管理的对象//2.@Bean:表示当前方法的返回值是一个bean对象,添加到IOC容器中@Beanpublic DataSource dataSource(){DruidDataSource ds = new DruidDataSource();ds.setDriverClassName(driver);ds.setUrl(url);ds.setUsername(userName);ds.setPassword(password);return ds;}
}

说明:如果@Value()中使用了EL表达式读取properties属性文件中的内容,那么就需要加载properties属性文件。

3.2 引用类型依赖注入

//Spring会自动从IOC容器中根据类型找到StudentDao对象赋值给参数studentDao变量,如果没有就会报错。@Beanpublic DataSource dataSource(StudentDao studentDao){System.out.println("JdbcConfig  studentDao = " + studentDao);DruidDataSource ds = new DruidDataSource();ds.setDriverClassName(driver);ds.setUrl(url);ds.setUsername(userName);ds.setPassword(password);return ds;}

注意:引用类型注入只需要为bean定义方法设置形参即可,容器会根据类型自动装配对象

3.3 测试类

    @Testpublic void testDatasource() throws SQLException {//目标:从IOC容器中获取德鲁伊连接池对象//1.AnnotationConfigApplicationContext加载Spring配置类初始化Spring容器AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfig.class);//按类型获取beanDataSource dataSource = ac.getBean(DataSource.class);Connection connection = dataSource.getConnection();//3.打印对象System.out.println("连接池对象:"+dataSource);System.out.println("连接象地址:"+connection);//4.关闭容器ac.close();}

3.4 注解开发总结

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

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

相关文章

HTTP 协议的基本格式和 fiddler 的用法

目录 一. HTTP 协议 1. HTTP协议是什么 2. HTTP协议的基本格式 HTTP请求 首行 GET和POST方法&#xff1a; 其他方法 经典面试题&#xff1a; URL Header(请求报头)部分 空行 ​HTTP响应 状态码总结: 二、Fiddler的用法 1.Fidder的安装 2.Fidder的使用 一. HTTP 协议 1. H…

解决macOS执行fastboot找不到设备的问题

背景 最近准备给我的备用机Redmi Note 11 5G刷个类原生的三方ROM&#xff0c;MIUI实在是用腻了。搜罗了一番&#xff0c;在XDA上找到了一个基于Pixel Experience开发的ROM&#xff1a;PixelExperience Plus for Redmi Note 11T/11S 5G/11 5G/POCO M4 Pro 5G (everpal)&#xf…

TMC Self-Managed 提升跨多云环境安全性

作为云原生技术栈的关键技术之一&#xff0c;Kubernetes 被企业用户广泛试用并开始支撑实际业务应用运行&#xff0c;实现技术先进性带来的生产力提升。但与此同时&#xff0c;随着 Kubernetes 技术的不断广泛与深化使用&#xff0c;企业用户也开始面临诸多技术上的挑战&#x…

嵌入式:ARM Day1

1. 思维导图 2.作业一 3.作业2

Android T 窗口层级其二 —— 层级结构树的构建(更新中)

如何通过dump中的内容找到对应的代码&#xff1f; 我们dump窗口层级发现会有很多信息&#xff0c;adb shell dumpsys activity containers 这里我们以其中的DefaultTaskDisplayArea为例 在源码的framework目录下查找该字符串&#xff0c;找到对应的代码就可以通过打印堆栈或者…

日常BUG —— Java判空注解

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;日常BUG、BUG、问题分析☀️每日 一言 &#xff1a;存在错误说明你在进步&#xff01; 一. 问题描述 问题一&#xff1a; 在使用Java自带的注解NotNull、NotEmpty、NotBlank时报错&#xff0c;…

CentOS8安装Git

错误1. 执行yum命令报错 【错误&#xff1a;Invalid configuration value: failovermethodpriority in /etc/yum.repos.d/CentOS-epel.repo; 配置&#xff1a;ID 为 "failovermethod" 的 OptionBinding 不存在】 1.cd /etc/yum.repos.d 2.vim CentOS-epel.repo //…

warning: remember to run ‘libtool --finish /usr/local/1/php-7.4.29/libs

ubuntu上php7.4.33编译安装完成后警告报错&#xff0c;如下所示 # /usr/local/apache2/apr/build-1/libtool --finish /usr/local/soft/php-7.4.33/libs # vim /etc/ld.so.conf.d/local.conf /usr/local/lib /usr/lib64 # ldconfig 或者安装依赖服务&#xff0c;重新编译 #…

Linu学习笔记——常用命令

Linux 常用命令全拼&#xff1a; Linux 常用命令全拼 | 菜鸟教程 一、切换root用户 1.给root用户设置密码 sudo passwd root 2.输入密码&#xff0c;并确认密码 3.切换到root用户 su&#xff1a;Swith user(切换用户) su root 二、切换目录 目录结构&#xff1a;Linux 系…

软件测试基础篇——Linux

1、Linux系统的特征 开源免费&#xff1a; 开源&#xff1a;开放源代码&#xff0c;指的是底层的源代码是可以开放出来&#xff0c;给相关的开发者&#xff0c;根据实际的需求做出修改的。 免费&#xff1a;不花钱&#xff0c;自由传播。 ​ Linux是一种免费使用和自由传播的…

【ARM 调试】如何从 crash 信息找出问题原因

一、问题背景 粉丝在进行 ARM-A 系列软件编程时遇到以下问题&#xff0c;串口打印这段日志后就重启了&#xff0c;粉丝求助问是什么原因&#xff1f; Unhandled Exception in EL3. x30 0x0000000000b99b84 x0 0x00000000179a25b0 x1 …

NGINX组件(rewrite)

一、location匹配的规则和优先级&#xff08;*&#xff09; URI&#xff1a;统一资源标识符&#xff0c;是一种字符串标识&#xff0c;用于标识抽象的或者是物理资源&#xff1b;如&#xff1a;文件、图片、视频等 nginx中的URI匹配的是&#xff1a;网址”/“后的路径 如&…

解决Idea 多模块,maven项目是多层级文件夹的子项时无法加入git管理的问题

问题 多模块项目&#xff0c;引入模块无法做git管理&#xff0c;第一个项目没有git分支标志&#xff0c;也不能像其他项目一样右键出git选项。 解决方法 发现该模块是多层级的文件夹结构&#xff0c;也就是项目本身在一个文件夹下。应该是要管理该文件夹。 Settings-Versi…

el-select控制单选还是多选

multiple表示多选&#xff0c;:multiple-limit“1” 限制多选的条数为1&#xff0c;2就是选两个&#xff0c;依此类推。为0 就是不限制选几个 使用 allow-create 属性即可通过在输入框中输入文字来创建新的条目。注意此时 filterable 必须为真。 <el-form :inline"true…

阿里云云主机_ECS云服务器_轻量_GPU_虚拟主机详解

阿里云云主机分为云虚拟主机、云服务器ECS、轻量应用服务器、GPU云服务器、弹性裸金属服务器、专有宿主机、FPGA云服务器、高性能计算E-HPC、无影云电脑等&#xff0c;阿里云百科来详细说下阿里云云主机详解&#xff1a; 目录 阿里云云主机 云服务器ECS 轻量应用服务器 云…

我学会这些车载技术,是不是就可以进【小米】车企?

作者&#xff1a;阿刁 随着智能化和电动化的发展&#xff0c;车载开发领域的前景非常广阔。许多手机厂商也纷纷加入进来&#xff0c;华为、小米等手机巨头也相继推出新能源汽车。所以在未来&#xff0c;车载系统将成为汽车的核心部分&#xff0c;涵盖车辆的控制、信息娱乐、智能…

安装paddleSeq2.7.0版本模块-笔记

安装paddleSeq2.7.0版本模块-笔记 先安装conda和python版本 本机安装的conda 22.9.0 python2.9.12 paddle2.4.2 paddlepaddle-gpu2.4.2 cuda10.2 安装matplotlib3.5.0版本 opencv_python-4.5.4.60-cp39-cp39-win_amd64.whl 测试采用分割模型名称&#xff1a;BiSeNetv2 #BiSe…

Oracle 开发篇+Java调用OJDBC访问Oracle数据库

标签&#xff1a;JAVA语言、Oracle数据库、Java访问Oracle数据库释义&#xff1a;OJDBC是Oracle公司提供的Java数据库连接驱动程序 ★ 实验环境 ※ Oracle 19c ※ OJDBC8 ※ JDK 8 ★ Java代码案例 package PAC_001; import java.sql.Connection; import java.sql.ResultSet…

【TensorFlow】P0 Windows GPU 安装 TensorFlow、CUDA Toolkit、cuDNN

Windows 安装 TensorFlow、CUDA Toolkit、cuDNN 整体流程概述TensorFlow 与 CUDA ToolkitTensorFlow 是一个基于数据流图的深度学习框架CUDA 充分利用 NIVIDIA GPU 的计算能力CUDA Toolkit cuDNN 安装详细流程整理流程一&#xff1a;安装 CUDA Toolkit步骤一&#xff1a;获取CU…

XML 数据传输格式

目录 XML简介 一、初识XML 1.什么是 XML&#xff1f; 2.XML 和 HTML 之间的差异 3.XML 不会做任何事情 4.通过 XML 您可以发明自己的标签 5.XML 不是对 HTML 的替代 二、XML 用途 1.XML 把数据从 HTML 分离 2.XML 简化数据共享 3.XML 简化数据传输 三、XML 树结构 1.一个 XML 文…