Spring Bean依赖注入-Spring入门(二)

1、SpringBean概述

在Spring中,一切Java对象都被视为Bean,用于实现某个具体功能。 Bean的依赖关系注入的过程,也称为Bean的装配过程。

Bean的装配方式有3种:

  • XML配置文件
  • 注解
  • Java类

Spring中常用的两种装配方式分别是基于XML的装配和基于注解的装配。

2、基于XML的配置

在Spring中,XML配置文件的根元素是<beans>,<beans>元素又包含多个<bean>子元素。每个<bean>子元素可以定义一个Bean,并描述该Bean的装配方式。Bean的常用属性如下表所示。

bean标签的属性
属  性说  明
idBean的唯一标识,其属性值不能重复,通过id属性值可以配置和管理Bean,也可以获取Bean
nameBean的名称标识,可以指定多个名称,每个名称之间用逗号或分号隔开,其他用法与id类似
class指定Bean的实现类,其属性值为类路径
scope指定Bean的作用范围,常用的属性值为singleton(单例)和prototype(原型)
autowire

指定Bean的自动装配方式,可设置为以下值。

(1)no:默认值,不进行Bean的自动装配。

(2)byName:根据id或name属性值自动装配。

(3)byType:根据属性类型自动装配。

(4)constructor:根据构造方法参数的数据类型进行byType模式的自动装配。

(5)default:由上级<beans>元素的default-autowire属性值确定

init-methodBean的生命周期方法-指定Bean初始化后节点的监控方法
destroy-methodBean的生命周期方法-指定Bean销毁前节点的监控方法

3、依赖注入

依赖注入(DI)是SpringIOC的具体实现。

在编写程序的过程中,通过控制反转,将对象交给了Spring容器,但是对象和对象之间是存在依赖关系的,IOC只是降低了他们的依赖关系,并不能消除,例如业务层需要调用持久层的方法,控制层需要调用业务层的方法。

在传统的编程中,这种依赖关系需要程序员自己进行维护,在使用Spring之后,就可以交给Spring来进行维护。简单的来说,就是让框架将持久层对象注入到业务层中,而不用程序员自己取获取。这就是依赖注入。

基于XML配置文件,Spring容器提供了两种注入方式:

  • setter方法注入
  • 构造方法注入
bean的子标签-依赖注入
元素说明
<constructor-arg>

通过Bean实现类的构造方法的参数设置其属性值,有以下几个属性。

(1)name:指定构造参数名称。

(2)index:指定构造参数序号,从0开始。

(3)type:指定构造参数类型。

(4)ref:设置构造参数值,为一个Bean的引用,即<bean>元素中的id或name属性值。

(5)value:设置构造参数值,为常量值。 此外,ref和value也可以作为其子元素设置构造参数值

<property>

通过Bean实现类中的setter方法设置其属性值,

(1)name:指定属性名称。

(2)ref:设置构造参数值,为一个Bean的引用,即<bean>元素中的id或name属性值。

(3)value:设置构造参数值,为常量值。

3.1、set方式注入

使用setter方法注入时,首先会调用Bean实现类的默认构造方法实例化Bean,然后通过Java的反射机制调用setXxx()方法来注入属性值,大致步骤如下。

  1. 在Bean的实现类中提供一个默认的无参构造方法(在没有有参构造方法的情况下,可省略),并为所有需要注入的属性提供一个setXxx()方法。
  2. 在XML配置文件中,通过<beans>元素及其<bean>子元素定义Bean。
  3. 在<bean>元素内使用<property>子元素注入各个属性的值。

 示例:在UserService使用set方式注入userDao的对象,调用userDao的方法;

1.在UserService添加set方法

public class UserService {//添加的方法, service 调用 dao层private UserDao ud;//setter方式注入public void setUd(UserDao ud) {this.ud = ud;}public void add(){ud.addUser();}
}

2.配置spring容器

    <bean id="userDao" class="com.yngm.dao.UserDao" ></bean><bean id="userService" class="com.yngm.service.UserService"><!--setter方式进行依赖注入name:指定 set的属性ref:设置构造参数值,为一个Bean的引用--><property name="ud"  ref="userDao"/></bean>

3.2、构造方法注入

构造方法注入是指通过Bean实现类的有参构造方法来注入属性值。

 1.创建有参构造方法

public class UserService {//添加的方法, service 调用 dao层private UserDao ud;//有参构造方法public UserService(UserDao ud) {this.ud = ud;}public void add(){ud.addUser();}
}

2、调用有参构造时进行注入

 <bean id="userDao" class="com.yngm.dao.UserDao" ></bean><bean id="userServiceArgs" class="com.yngm.service.UserService"><!--构造方法注入name:指定 set的属性ref:设置构造参数值,为一个Bean的引用--><constructor-arg name="ud" ref="userDao"/></bean>

4、不同数据类型的依赖注入

上面的操作,都是注入的引用Bean,除了对象的引用可以注入,普通数据类型,数组、集合等都可以在容器中进行注入。

注入数据的三种数据类型
● 普通数据类型
● 引用数据类型
● 集合数据类型

4.1、普通数据类型注入

这里的普通数据类型指的是java的基本数据类型和String的类型,请参考如下代码:

public class BubbleTea {private String drinkName;private String size;private String ice;private String sugar;//省略setter和getter方法,编写测试的时候需要添加setter方法哦
}
<!--注入奶茶数据--><bean id="tea" class="com.yngm.domain.BubbleTea"><!--通过set方法进行初始化--><property name="drinkName" value="伯牙绝弦"/><property name="size" value="大杯"/><property name="ice" value="热"/><property name="sugar" value="不糖"/></bean>

4.2、集合类型注入

public class BubbleTea {//String 类型的集合private List<String> listStr;//用户类型的集合private List<User> listUser;public void setListUser(List<User> listUser) {this.listUser = listUser;}public void setListStr(List<String> listStr) {this.listStr = listStr;}
 <bean id="user" class="com.kdf.domain.User"><property name="name" value="张三"/><property name="pwd" value="123"/></bean><bean name="user1" class="com.kdf.domain.User"><property name="name" value="里斯"/><property name="pwd" value="456"/></bean><bean id="tea" class="com.kdf.domain.BubbleTea"><property name="listStr"><list><value>aaa</value><value>bbb</value><value>ccc</value></list></property><property name="listUser"><!--ref bean 引入对象给list集合赋值--><list><ref bean="user"/><ref bean="user1"/></list></property></bean>

 4.3、集合类型 Map<String,User> 

public class BubbleTea{//map集合private Map<String,User> userMap;public void setUserMap(Map<String, User> userMap) {this.userMap = userMap;}
}
<bean id="tea" class="com.kdf.domain.BubbleTea"><property name="userMap"><map><!--key:自定义map的键, value:赋常量值 value-ref:引用user对象给map赋值--><entry key="u1" value-ref="user"/><entry key="u2" value-ref="user1"/></map></property></bean>

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

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

相关文章

Codeforces Round 821 (Div. 2) D2. Zero-One

题目 #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e5 5, inf 1e18, maxm 4e4 5; const int N 1e6;c…

【MySQL】InnoDB与MyISAM存储引擎的区别与选择

存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式 。 存储引擎是基于表的&#xff0c;而不是基于库的&#xff0c;所以存储引擎也可被称为表类型。我们可以在创建表的时候&#xff0c;来指定选择的存储引擎&#xff0c;如果没有指定将自动选择默认的存储引擎。…

【工具-PyCharm】

工具-PyCharm ■ PyCharm-简介■ PyCharm-安装■ PyCharm-使用■ 修改主题■ 设置字体■ 代码模板■ 解释器配置■ 文件默认编码■ 快捷键■ 折叠■ 移动■ 注释■ 编辑■ 删除■ 查看■ 缩进■ 替换 ■ PyCharm-简介 官方下载地址 Professional&#xff1a;专业版&#xff0…

python--使用pika库操作rabbitmq实现需求

Author: wencoo Blog&#xff1a;https://wencoo.blog.csdn.net/ Date: 22/04/2024 Email: jianwen056aliyun.com Wechat&#xff1a;wencoo824 QQ&#xff1a;1419440391 Details:文章目录 目录正文 或 背景pika链接mqpika指定消费数量pika自动消费实现pika获取队列任务数量pi…

JavaScript(二)

JavaScript的语法 1.JavaScript的大小写 在JavaScript中&#xff0c;大小写是敏感的&#xff0c;这意味着大小写不同的标识符被视为不同的变量或函数。例如&#xff0c;myVariable 和 myvariable 被视为两个不同的变量。因此&#xff0c;在编写JavaScript代码时&#xff0c;必…

如何在PostgreSQL中创建并使用窗口函数来进行复杂的分析查询?

文章目录 解决方案1. 了解窗口函数的基本概念2. 常用的窗口函数3. 使用示例示例 1&#xff1a;计算每行销售数据的累计销售额示例 2&#xff1a;计算每行销售数据相对于前一行销售额的增长率 结论 PostgreSQL 提供了一套强大的窗口函数&#xff08;Window Functions&#xff09…

MQTT Broker 白皮书:全面实用的 MQTT Broker 选型指南

在智能数字化时代&#xff0c;家居设备、工厂传感器、智能汽车、能源电力计量表等各类设备都已变身为新型的智能终端。为了满足这些海量且持续增长的智能设备之间对于实时、可靠的消息传递的需求&#xff0c;MQTT Broker 消息代理或消息中间件扮演了至关重要的角色。作为新一代…

STM32H750外设ADC之模拟窗口看门狗

目录 概述 1 相关寄存器 2 功能描述 3 AWDx 标志和中断 4 模拟看门狗 1 4.1 模拟看门狗 1 说明 4.2 模拟看门狗通道选择 4.3 阀值选择 5 模拟看门狗 2和3 6 ADCx_AWDy_OUT 信号输出生成 6.1 功能介绍 6.2 输出信号案例 7 模拟看门狗 1、 2、 3 比较 概述 本文主…

Opencv_3_图像对象的创建与赋值

ColorInvert.h 如下&#xff1a; #include <opencv.hpp> using namespace std; #include <opencv.hpp> using namespace cv; using namespace std; class ColorInvert{ public : void mat_creation(); }; ColorInvert.cpp 文件如下&#xff1a; #include &q…

解决宝塔面板无法访问(无法访问或拒绝链接)

&#x1f40c;博主主页&#xff1a;&#x1f40c;​倔强的大蜗牛&#x1f40c;​ &#x1f4da;专栏分类&#xff1a;Linux ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 问题如下&#xff1a; 本人设置了授权IP&#xff0c;但是有些问题&#xff0c;所以是打算取消授权IP 重…

Spring Boot 自动装配执行流程

Spring Boot 自动装配执行流程 Spring Boot 自动装配执行流程如下&#xff1a; Spring Boot 启动时会创建一个 SpringApplication实例&#xff0c;该实例存储了应用相关信息&#xff0c;它负责启动并运行应用。实例化 SpringApplication 时&#xff0c;会自动装载META-INF/spr…

Linux文件chattr/lsattr/Linux权限(搭建权限测试环境实战)引申到内部原理及Linux删除系统文件原理-7539字详谈

企业高薪思维: 每一个阶段什么时候是最重要的&#xff1f;&#xff08;快速定位&#xff09; 1.学习最重要的事情 &#xff08;学生阶段&#xff0c;找工作前阶段&#xff09; 2.家庭&#xff0c;女朋友 &#xff08;工作阶段/学生阶段&#xff0c;学习不受到影响&#xff09; …

修改Ubuntu22.04系统图标

在Ubuntu 22.04中更改开机时显示的Ubuntu图标需要修改的设置。 主要思路是用自己图片替换系统图片&#xff0c;保持系统图片同名&#xff0c;同格式。 以下是一般的步骤&#xff1a; 修改启动界面的logo&#xff1a; sudo cp 新logo.png /usr/share/plymouth/themes/spinn…

@NameBinding注解名称绑定过滤器/拦截器

NameBinding注解名称绑定过滤器/拦截器&#xff0c;只针对某一些资源方法执行处理逻辑 一、为什么要用名称绑定 一般情况下&#xff0c;借助Spring的过滤器或者拦截器等对Http请求或响应进行处理就能满足需求。但是在有些场景下若只需对特定的xxxResource做拦截处理&#xff0…

项目大集成

一 keeplived 高可用 192.168.11.11nginx keeplived192.168.11.12nginx keeplived 两台均编译安装服务器 1 主服务器修改文件&#xff1a; 2 备服务器修改文本 scp keepalived.conf 192.168.11.12:/etc/keepalived/ 3 给主服务器添加虚拟ip ifconfig ens33:0 192.168…

【多态】底层原理

博主首页&#xff1a; 有趣的中国人 专栏首页&#xff1a; C进阶 本篇文章主要讲解 多态底层原理 的相关内容 1. 多态原理 1.1 虚函数表 先看一下这段代码&#xff0c;计算一下sizeof(Base)是多少&#xff1a; class Base { public:virtual void Func1(){cout << &quo…

Oracle 21 C 安装详细操作手册,并配置客户端连接

Oracle 21 C 安装详细操作手册 Win 11 Oracle 21C 下载&#xff1a; Database Software Downloads | Oracle 中国 云盘共享 链接&#xff1a;https://pan.baidu.com/s/12XCilnFYyLFnSVoU_ShaSA 提取码&#xff1a;nfwc Oracle 21C 配置与登陆&#xff1a; 开始菜单 NetMa…

Git下载安装

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

华为认证云计算前景如何

互联网/移动互联网经历了高速发展的二十年&#xff0c;我们有幸一起见证了华为、阿里、腾讯、百度、字节跳动、京东、滴滴、拼多多等互联网公司的崛起&#xff0c;让普通技术人实现逆袭拿到高薪&#xff0c;也让小镇做题家们有了阶层跨越的机会。 但机会都是留给有准备的人&…

C++:特殊成员函数

构造函数、析构函数和拷贝构造函数是C类中的三种特殊成员函数&#xff0c;它们分别用于对象的初始化、清理和拷贝操作。 1.构造函数&#xff08;Constructor&#xff09;&#xff1a;构造函数在对象创建时自动调用&#xff0c;用于初始化对象的成员变量。它的名称与类名相同&a…