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

embedded/2024/10/18 3:29:51/

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方法

java">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.创建有参构造方法

java">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的类型,请参考如下代码:

java">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、集合类型注入

java">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> 

java">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.ppmy.cn/embedded/19986.html

相关文章

【深度学习】Yolov8使用心得

兜兜转转&#xff0c;原本以为和yolov没啥关系了&#xff0c;但是新公司又回到了yolov侧。 yolov8 可以用pip的方式安装&#xff0c;以package的三方软件包形式&#xff0c;隐藏了很多细节。当然你也可以从git上把全套代码down下来。 1.分类模型 1.1 改错误 位置&#xff1a…

SpringBoot下载Excel模板功能

目录 一、前端只需要填写一个a标签调用一下后端接口即可 二、后端 2.1 准备一个excel模板 &#xff0c;将其复制到resource目录下的templates文件夹下 2.2 接着复制下列代码即可 三、运行效果 一、前端只需要填写一个a标签调用一下后端接口即可 1.1 先代理一下防止跨域 e…

Linux - tar (tape archive)

tar 的全称是 Tape Archive。它最初是在 Unix 系统中用于将数据写入磁带的工具&#xff0c;但现在它通常用于创建、维护、修改和提取文件的归档文件。尽管 tar 可以用于压缩和解压缩文件&#xff0c;但它本身并不进行压缩&#xff0c;而是通常与 gzip 或 bzip2 等压缩工具一起使…

Navicat连接SQL server出现:[IM002] [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序(0)

问题 解决方法 一 找到Navicat的安装路径&#xff0c;然后找到sqlncli_x64.msi文件并安装&#xff0c;安装成功后重启Navicat重新进行连接&#xff0c;看是否成功。 解决方法 二 如果方法一没有找到找到sqlncli_x64.msi 还是Navicat的安装路径&#xff0c;然后找到msodbcsql_64…

算法人生(11):从“梯度提升树(GBDT)”看“2/8时间管理法”

梯度提升树&#xff08;Gradient Boosting Decision Trees, GBDT&#xff09;是一种高效的机器学习算法&#xff0c;它通过迭代构建多个决策树并综合它们的预测结果来提高预测的准确率。GBDT的核心思想在于&#xff0c;每一棵树都尝试对前一棵树留下的预测残差进行修正&#xf…

[c++]菱形继承解析

菱形继承 大概示意图&#xff1a; 菱形继承不一定只是标准的菱形&#xff0c;只要形似菱形的都可以叫菱形继承。 (以下说明都是默认公有继承&#xff0c;public和protected成员情况下) 菱形继承会造成数据的冗余和二义性&#xff1a; 冗余&#xff1a;一个Assitant对象里面有…

tensorflow_decision_forests\tensorflow\ops\inference\inference.so not found

恰好有一个帖子提到了py3.10里面的解决方案 pip install --user tensorflow2.11.0My tensorflow version is 2.11.0 and my tensorflow_decision_forests version is 1.2.0 so those should be compatible. I also am using Python version 3.10.11原文链接&#xff1a; http…

leetCode59. 螺旋矩阵 II

leetCode59. 螺旋矩阵 II 题目思路&#xff1a;见我的这篇博客 代码 class Solution { public:vector<vector<int>> generateMatrix(int n) {// n * n的矩阵的初始化vector<vector<int>> res(n, vector<int> (n));// 方向数组int dx[] {0, 1…