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>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[嵌入式系统-52]:RT-Thread:RT-Thread Studio工程的文件结构

目录 一、RT-Thread Studio概述 二、RT-Thread Studio工程架构 2.1 目录结构 2.2 软件包管理 2.3 硬件电路板信息 2.3 可执行文件elf信息 2.4 系统头文件 2.5 应用程序目录 2.6 硬件驱动程序 2.7 RT Thread操作系统程序 2.7.1 component&#xff1a;应用程序组件 …

PD虚拟机和双系统哪个好 Mac建议装双系统吗

在当今数字化时代&#xff0c;对于部分使用Mac电脑的用户来说&#xff0c;选择如何在系统中运行Windows或其他操作系统能节省大量精力。Parallels Desktop&#xff08;PD&#xff09;虚拟机和双系统是两种常见的选择&#xff0c;它们各自具有优势和限制。下面我们来看看PD虚拟机…

【MyBatis】(动态SQL <if> 标签 <trim>标签 <where>标签<set>标签<foreach>标签<include>标签)

文章目录 动态SQL< if > 标签< trim> 标签< where> 标签< set> 标签< foreach> 标签< include> 标签 动态SQL 在MyBatis框架中&#xff0c;动态SQL是一个强大的特性。它允许我们根据不同的条件动态的组装SQL语句&#xff0c;能够灵活的发…

【pycharm】调试模式中四个常用按钮介绍

【pycharm】调试模式中四个常用按钮介绍 在 PyCharm 的调试模式中&#xff0c;有四个常用的按钮&#xff0c;它们的功能如下&#xff1a; Step Over (F8)&#xff1a;单步执行&#xff0c;但在遇到函数调用时&#xff0c;不会进入函数内部&#xff0c;而是将整个函数作为一步执…

UVa12313 A Tiny Raytracer

UVa12313 A Tiny Raytracer 题目链接题意分析AC 代码 题目链接 UVA - 12313 A Tiny Raytracer 题意 给出 《训练指南》题意翻译 本题的任务是实现一个小型光线追踪渲染器。场景由若干三角形网格&#xff08;triangle mesh&#xff09;组成&#xff0c;有且仅有一个点光源&…

三苯基膦以及副产物的处理方式

参考文献&#xff1a; Easy Removal of Triphenylphosphine Oxide from Reaction Mixtures by Precipitation with CaBr2 | Organic Process Research & Development (acs.org) Triphenylphosphine Oxide Removal from Reactions: The Role of Solvent and Temperature |…

分享一些实用的工具

1、amCharts5&#xff1a;模拟航线飞行/业务分布图/k线/数据分析/地图等 网址&#xff1a; JavaScript mapping library: amCharts 5https://www.amcharts.com/javascript-maps/ Demo地址&#xff1a;Chart Demos - amChartshttps://www.amcharts.com/demos/#maps 他分为amC…

[华为OD] 给航天器一侧加装长方形或正方形的太阳能板 100

给航天器一侧加装长方形或正方形的太阳能板&#xff08;图中的红色斜线区域&#xff09;&#xff0c;需要先安装两个支 柱&#xff08;图中的黑色竖条&#xff09;&#xff0c;再在支柱的中间部分固定太阳能板。但航天器不同位置的支柱长度 不同&#xff0c;太阳能板的安装面…

学习笔记-数据结构-线性表(2024-04-18)- 单向链表选择排序

试以单向链表为存储结构实现简单选择排序的算法。 实现递增排序&#xff0c;首先选择一个元素作为第一个比较值&#xff0c;遍历其他所有的元素&#xff0c;如果发现其他元素中有比它小的元素&#xff0c;则交换两个元素&#xff0c;这样每一趟都能找到符合要求的最小值 正经…

selenium 自动化测试课上实操指南1——百度搜索

1.环境准备 下面的所有资源可以从超星班级资料中下载&#xff0c;机房的同学在收到的文件夹中可以找到文件 非本校同学&#xff0c;免费加入学银在线课程&#xff0c;就可以在资料 根目录 > 02 课件新 > week09 web自动化测试02 里下载本次实操资料 1&#xff09;安…

K8S探针分享

一&#xff0c;探针介绍 1 探针类型 livenessProbe&#xff1a;存活探针&#xff0c;用于判断容器是不是健康&#xff1b;如果探测失败&#xff0c;Kubernetes就会重启容器。 readinessProbe&#xff1a;就绪探针&#xff0c;用于判断是否可以将容器加入到Service负载均衡池…

使用Tortoise 创建远程分支

1。首先创建本地分支branch1&#xff0c;右键tortoise git->创建分支&#xff0c;输入分支名称branch1&#xff0c;确定。 2。右键tortoise git->推送&#xff0c;按下图设置&#xff0c;确定&#xff0c;git会判断远程有没有分支branch1&#xff0c;如果没有会自动创建…

C++学习随笔(11)——vector

本章我们来学习一下vector&#xff01; 目录 1.vector的介绍及使用 1.1 vector的介绍 1.2 vector的使用 1.2.1 vector的定义 1.2.2 vector iterator 的使用 1.2.3 vector 空间增长问题 1.2.4 vector 增删查改 1.2.5 vector 迭代器失效问题。 1.vector的介绍及使用 1…

ANSYS WorkBench基础说明

1引入CAE产品设计流程 2有限元法简介 有限元法的基本概念:把一个原来是连续的物体划分为有限个单元&#xff0c;这些单元通过有限个节点相互连接&#xff0c;承受与实际载荷等效的节点载荷&#xff0c;根据力的平衡条件进行分析&#xff0c;并根据变形协调条件把这些单元重新组…

【Redis 开发】全局ID生成器

全局ID生成器 为了增加ID的安全性&#xff0c;我们可以不直接使用Redis自增的数值&#xff0c;而是拼接一些其他信息&#xff1a; ID的组成部分&#xff1a; 符号位:1bit,一直为0 时间戳:31bit&#xff0c;一秒为单位&#xff0c;可以使用69年 序列号:32bit&#xff0c;秒内…

idea 通过maven构建无法使用@SpringBootApplication

问题描述 SpringBootApplication标红&#xff0c;没有提示&#xff0c;无法启动springboot使用maven构建。通过idea的标准版本构建 原因 springboot构建启动依赖spring-boot-maven-plugin idea的标准版本没有指定构建版本&#xff0c;然后在springboot-parent里面没有指定默…

(已解决)PyQT5问题:控件和背景色同色,如何解决?

一、问题复现 难看到吐是不是 二、解决方案 拖动一个widget&#xff0c;设置其背景色&#xff0c;并且右键放到最后一层 三、解决结果 如上图所示 四、问题原因 直接在窗体右键设置背景色&#xff0c;由于Form是父类&#xff0c;即其下所有控件都与其同色&#xff0c;即使…

知识在人工智能中的核心作用:连接主义与符号主义的交融

知识在人工智能中的核心作用&#xff1a;连接主义与符号主义的交融 一、连接主义与深度学习的崛起二、感知与认知&#xff1a;AI的双眼与大脑三、知识的多元表示与处理四、符号主义与知识工程的实践五、知识在AI中的核心地位六、AI的具体应用案例分析七、知识图谱&#xff1a;认…

Linux多线程(一) 线程的创建与控制

一、线程概述 线程是轻量级的进程&#xff08;LWP&#xff1a;light weight process&#xff09;&#xff0c;在Linux环境下线程的本质仍是进程。在计算机上运行的程序是一组指令及指令参数的组合&#xff0c;指令按照既定的逻辑控制计算机运行。操作系统会以进程为单位&#…

element-ui et -i 编译默认主题报错:ReferenceError: primordials is not defined

报错信息如下 fs.js:40 } primordials;^ ReferenceError: primordials is not defined导致这个问题的原因&#xff1a;node和gulp版本冲突&#xff01;&#xff01; 我使用的是node 14版本 解决方法&#xff1a; 看了好几个帖子&#xff0c;都推荐使用node 11.15.0版本&am…