Spring框架-IoC的使用(基于XML和注解两种方式)

一、Spring IoC使用-基于XML

1 IoC使用-基于XML

使用SpringIoC组件创建并管理对象

1.1 创建实体类

package com.feng.ioc.bean;import java.util.Date;/*** @program: spring-ioc-demo1* @description: 学生实体类* @author: FF* @create: 2024-12-04 18:53**/
public class Student {private String stuNum;private String stuName;private int stuAge;private Date enterenceTime;//学生的入学日期public String getStuNum() {return stuNum;}public String getStuName() {return stuName;}public int getStuAge() {return stuAge;}public Date getEnterenceTime() {return enterenceTime;}public void setStuNum(String stuNum) {this.stuNum = stuNum;}public void setStuName(String stuName) {this.stuName = stuName;}public void setStuAge(int stuAge) {this.stuAge = stuAge;}public void setEnterenceTime(Date enterenceTime) {this.enterenceTime = enterenceTime;}@Overridepublic String toString() {return "Student{" +"stuNum='" + stuNum + '\'' +", stuName='" + stuName + '\'' +", stuAge=" + stuAge +", enterenceTime='" + enterenceTime + '\'' +'}';}
}

1.2 在Spring配置文件中配置实体类

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 对于一个xml文件如果作为框架的配置文件,需要遵守框架的配置规则 --><!-- 通常一个框架为了让开发者能够正确的配置,都会提供xml规范文件 (dtd\xsd)--><!--通过bean标签将实体类配置给Spring进行管理.id表示实体类的唯一标识--><bean id="student" class="com.feng.ioc.bean.Student"><property name="stuNum" value="2"/><property name="stuName" value="小帅"/><property name="stuAge" value="20"/></bean></beans>

1.3 初始化Spring对象工厂,获取对象

  • ClassPathXmlApplicationContext
    
package com.feng.ioc.test;import com.feng.ioc.bean.Student;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** @program: spring-ioc-demo1* @description: 测试类* @author: FF* @create: 2024-12-04 19:03**/
public class Test2 {public static void main(String[] args) {// 通过Spring容器创建Student对象//1.初始化Spring容器ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");//2.通过Spring容器,获取Student对象Student student = (Student) classPathXmlApplicationContext.getBean("student");System.out.println(student);}
}

2 IoC和DI

  • IoC控制反转,通过Spring工厂完成对象的创建
  • DI 依赖注入,在Spring完成对象创建的同时,依赖Spring容器完成对象属性的赋值

2.1 IoC

当我们需要Spring对象工厂创建某个类的实例时,需要将这个类交给Spring管理–通过bean标签配置

<bean id="date" class="java.util.Date"/>
<bean id="student" class="com.feng.ioc.bean.Student"></bean>

2.2 DI

通过Spring容器给创建的对象属性赋值

<bean id="date" class="java.util.Date"/>
<bean id="student" class="com.feng.ioc.bean.Student"><property name="stuNum" value="2"/><property name="stuName" value="小帅"/><property name="stuAge" value="20"/><property name="enterenceTime" ref="date"/>
</bean>

3 DI依赖注入

3.1 依赖注入的三种方式

Spring容器加载配置文件后,通过反射创建类的对象,并给属性赋值。

Spring容器通过反射实现属性注入有两种方式:

  • set方法注入
  • 构造器注入
  • 接口注入

3.2 set方法注入

bean标签中的通过配置标签给属性赋值,也就是通过反射的set方法注入

简单类型及字符串类型

直接通过property标签的value属性赋值

<bean id="student" class="com.feng.ioc.bean.Student"><property name="stuNum" value="2"/><property name="stuName" value="小帅"/><property name="stuAge" value="20"/><property name="weight" value="20"/></bean>

日期对象

  • 方式一:在property标签中通过ref引用Spring容器中的一个对象
   	<bean id="date" class="java.util.Date"/><bean id="student" class="com.feng.ioc.bean.Student"><!--日期类型赋值--><property name="enterenceTime" ref="date"/></bean>
  • 方式二:在property标签中添加子标签bean来指定对象
    <bean id="student" class="com.feng.ioc.bean.Student"><!--日期类型赋值--><!--<property name="enterenceTime" ref="date"/>--><property name="enterenceTime"><bean class="java.util.Date"/></property></bean>   

自定义对象类型

  • 方式一:在property标签中通过ref引用Spring容器中的一个对象
<bean id="clazz" class="com.feng.ioc.bean.Clazz"><property name="cid" value="1"/><property name="cname" value="计算机应用01班"/>
</bean>
<bean id="student" class="com.feng.ioc.bean.Student"><property name="clazz" ref="clazz"/>
</bean>

方式二:在property标签中添加子标签bean来指定对象

<bean id="student" class="com.feng.ioc.bean.Student"><property name="clazz" ><bean class="com.feng.ioc.bean.Clazz"><property name="cid" value="01"/><property name="cname"  value="计算机"/></bean></property>
</bean>

集合类型

  • list:

    • List:List中是字符串或简单类型的封装

      <property name="hobbies" value="吃饭,喝酒"/>
      
    • List:List中的元素是对象类型

      		<property name="clazzes"><list><bean class="com.feng.ioc.bean.Clazz"><property name="cid" value="1"/><property name="cname" value="计算机"/></bean><bean class="com.feng.ioc.bean.Clazz"><property name="cid" value="2"/><property name="cname" value="计算机2"/></bean></list></property>
      
  • Set:与List方式相同,将标签改为标签

<property name="clazzes"><set><bean class="com.feng.ioc.bean.Clazz"><property name="cid" value="1"/><property name="cname" value="计算机"/></bean><bean class="com.feng.ioc.bean.Clazz"><property name="cid" value="2"/><property name="cname" value="计算机2"/></bean></set></property>
  • Map:—
		<property name="map"><map><entry key="1" value="map1"/><entry key="2" value="map2"/></map></property>
  • Properties
		<property name="properties"><props><prop key="1">value1</prop><prop key="2">value2</prop></props></property>

3.3 构造器注入

简单类型、字符串、对象

<bean id="date" class="java.util.Date"/><bean id="clazz" class="com.feng.ioc.bean.Clazz"><property name="cid" value="1"/><property name="cname" value="计算机应用01班"/></bean><!--构造器注入--><bean id="student" class="com.feng.ioc.bean.Student"><constructor-arg value="1001"/><constructor-arg value="小明"/><constructor-arg value="18"/><constructor-arg value="55.5"/><constructor-arg ref="date"/><constructor-arg ref="clazz"/></bean>

集合类型

<!--构造器注入--><bean id="student" class="com.feng.ioc.bean.Student"><constructor-arg><list><value>吃饭</value><value>喝酒</value></list></constructor-arg><constructor-arg><list><bean class="com.feng.ioc.bean.Clazz"><property name="cid" value="101"/><property name="cname" value="计算机"/></bean></list></constructor-arg><constructor-arg><set><value>抽烟</value><value>烫头</value></set></constructor-arg><constructor-arg><map><entry key="1" value="map1"/><entry key="2" value="map2"/></map></constructor-arg><constructor-arg><props><prop key="3">prop3</prop><prop key="4">prop4</prop></props></constructor-arg></bean>

4 Bean的作用域

在bean标签中,可以通过scope属性,指定对象的作用域

  • scope = singleton 单例模式(默认饿汉模式,Spring容器初始化阶段会完成此对象创建)
    • lazy-init = true — 懒汉模式
  • scope = prototype 多例模式

5 Bean的生命周期

在bean标签中通过init-method属性,指定当前bean的初始化方法,初始化方法在构造器执行之后执行

通过destroy-method属性,指定当前bean的销毁方法,销毁方法在对象销毁之前执行

6 自动装配

自动装配(autowire):Spring在实例化当前bean时,从容器中找到匹配的实例,赋值给当前bean的属性

  • autowire=“byName”:根据bean属性名

  • autowire=“byType”:根据bean属性类型

7 Spring IoC工作原理

  • 当初始化Spring容器时:
    • Spring会加载并解析xml文件,并将解析结果存放到config Map中。
    • 单例模式-饿汉,则会通过配置ID,从config Map取出key对应的value(类的全路径地址)
    • 通过反射机制,创建对象,并将对象存放到bean Map中。
  • 当业务代码通过context.getBean(“”)创建对象时:
    • 单例模式-饿汉:直接通过参数id从bean Map中取出对象;
    • 单例模式-懒汉:先通过参数id从bean Map中寻找对象是否存在?存在则直接使用,不存在,则去config Map中找到classPath,通过反射创建对象并返回,同时将创建的对象保存到bean Map,以供下次实例创建时调用;(如果configMap中没有找到对应classPath,则抛出异常)
    • 多例模式:通过参数id从bean Map中寻找是否存在?存在即直接使用,不存在则去config Map中找到classPath,通过反射创建对象并返回,但是不保存bean Map,因为下次创建新对象的时候,需要重新调用反射创建。

在这里插入图片描述

二、Spring IoC – 基于注解

Spring IoC的使用,需要我们通过XML将类声明给Spring容器进行管理,从而通过Spring工厂完成对象的创建及属性值注入。

Spring除了提供基于xml的配置方法,同时提供了基于注解的配置:直接在实体类中添加注解声明给Spring容器管理,以简化开发步骤。

2.1 框架部署

  • 创建maven工程

  • 添加Spring依赖

    • 	<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.25.RELEASE</version></dependency></dependencies>
      
  • 创建Spring配置文件

Spring容器初始化时,只会加载applicationContext.xml,那么我们实体类中添加的注解就不会被Spring扫描,所以我们需要在application Context.xml声明Spring的扫描范围,以达到Spring初始化时扫描带有注解的实体类并完成初始化工作。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!--声明使用注解配置--><context:annotation-config/><!--声明Spring工厂注解的扫描范围--><context:component-scan base-package="com.feng.bean"/>
</beans>

2.2 IoC常用注解

2.2.1 @Component

  • 类注解:声明此类被容器管理,相当于bean标签作用
  • @Component(value=“stu”) value 属性用于指定当前bean的id,相当于bean标签的id属性;value属性也可以省略,如果省略当前类的id默认类名首字母改小写;
  • @Service @Controller @Repository 这三个注解也可以将类声明给Spring管理,他们主要是语义上的区别
    • @Controller 注解主要声明将控制器类配置给Spring管理,例如Servlet
    • @Service 注解主要声明业务处理类配置给Spring管理,例如Service接口的实现类
    • @Repository 注解主要声明持久化类配置给Spring管理,例如DAO接口
    • @Component 除了控制器、service和DAO之外的类,一律使用此注解声明

2.2.2 @Scope

  • 类注解,用于声明当前类是单例模式还是多例模式,相当于bean标签的scope属性
  • @Scope(“prototype”) 表示声明当前类为非单例模式(默认是单例模式)

2.2.3 @Lazy(value = false)

类注解,用于声明一个单例模式的bean是否为懒汉模式

@Lazy(value = true) 表示为懒汉模式。

2.2.4 @PostConstruct

  • 方法注解:声明一个方法为当前类的初始化方法(在构造器之后),相当于bean标签的init-method属性

2.2.5 @PreDestroy

  • 方法注解:声明一个方法为当前类的销毁方法(在对象从容器中释放之前执行),相当于bean标签的destory-method属性

2.2.6 @Autowired

  • 属性注解、方法注解(set方法):自动装配,默认 byType
  • @Autowired(required = false) 通过requried属性,设置当前自动装配是否为必须(默认true必须,如果没有找到类型与属性类型匹配的bean则抛出异常)
    • byType
    • ref引用 @Qualifier(“”)
private Clazz clazz;@Autowired(required = false)public void setClazz(@Qualifier("clazz")Clazz clazz) {this.clazz = clazz;}

2.2.7 @Resource

  • 属性注解,用于声明属性自动装配

  • 默认装配方式为 byName,如果根据byName没有找到对用的bean,则继续根据byType继续寻找,根据byType依然没有找到bean,或者找到不止一个类型匹配的bean,则抛出异常。
    3.3.5 @PreDestroy

  • 方法注解:声明一个方法为当前类的销毁方法(在对象从容器中释放之前执行),相当于bean标签的destory-method属性

2.2.8 @Autowired

  • 属性注解、方法注解(set方法):自动装配,默认 byType
  • @Autowired(required = false) 通过requried属性,设置当前自动装配是否为必须(默认true必须,如果没有找到类型与属性类型匹配的bean则抛出异常)
    • byType
    • ref引用 @Qualifier(“”)
private Clazz clazz;@Autowired(required = false)public void setClazz(@Qualifier("clazz")Clazz clazz) {this.clazz = clazz;}

2.2.9 @Resource

  • 属性注解,用于声明属性自动装配
  • 默认装配方式为 byName,如果根据byName没有找到对用的bean,则继续根据byType继续寻找,根据byType依然没有找到bean,或者找到不止一个类型匹配的bean,则抛出异常。

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

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

相关文章

AndroidStudio-常见界面控件

一、Button package com.example.review01import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.Button import android.widget.TextViewclass Review01Activity : AppCompatActivity() {override fun onCreate(savedInstanceStat…

汽车IVI中控开发入门及进阶(三十六):QML调用蓝牙sdk的架构

Qt/QML本身在做GUI界面工程时,除了各种界面上的按钮、图片、工具条等元素之外,最方便的就是可以通过C++实现界面各种复杂逻辑,而实现上不可避免就需要一些外部库的支持,不管是静态库.a还是动态库.so,比如蓝牙模块。 而QML/C++启动一个蓝牙协议栈SDK作为一个进程,然后启动…

即时通信系统项目总览

聊天室服务端项目总体介绍 本项目是一个全栈的即时通信系统, 前端使用QT实现聊天客户端, 后端采⽤微服务框架设计, 由网关子服务统一接收客户端的请求, 再分发到不同的子服务上处理并将结果返回给网关, 网关再将响应转发给客户端 拆分的微服务包含&#xff1a; 网关服务器&…

TDesign:Radio 单选框

Radio 单选框文档地址 view TDRadioGroup(onRadioGroupChange: (String? selectedId){controller.onTapSelectId(selectedId!);},contentDirection: TDContentDirection.left,selectId: 1,child: <Widget>[TDRadio(id: 1,selectColor:const Color(0xffFF770F),showDivi…

【已解决】windows下安装Git

文章目录 1. 下载Git2. 安装3. 测试安装是否成功 1. 下载Git https://git-scm.com/downloads/win 进入到官网后如下如图&#xff0c;并选择自己需要的版本&#xff0c;点击即可下载 2. 安装 2.1 下载完成后双击打开&#xff0c;点击Next 2.2 选择安装路径 2.3 选择必要组件…

策略模式实战 - 鸭展

该示例出自著名的《HeadFirst》系列的《HeadFirst设计模式》图书的第一个设计模式。用一个鸭子展览的小应用&#xff0c;一步步揭示了如何引入和使用策略模式将示例改造的完美一些。 文章目录 红头鸭与绿头鸭橡皮鸭和诱饵鸭用接口代替继承组合关系与策略模式 红头鸭与绿头鸭 当…

Leetcode—367. 有效的完全平方数【简单】

2024每日刷题&#xff08;208&#xff09; Leetcode—367. 有效的完全平方数 C实现代码 class Solution { public:bool isPerfectSquare(int num) {for(long long i 1; i < num / 2 1; i) {if(i * i num) {return true;}}return false;} };运行结果 二分法实现代码 cl…

【大语言模型】LangChain LCEL 表达式语言

【大语言模型】LangChain LCEL 表达式语言 一、简介二、LCEL的优势三、LCEL 的基本使用1、Runnable 对象 四、实战实例 一、简介 LangChain LCEL 的全称为 LangChain Expression Language 即可直译为 LangChain 表达式。 为了构造更复杂的 LLM 应用并且更为简便快捷的构造 LLM…

【深入探索 C++ STL 双端队列 】deque —— 数据时空的双端虫洞,扭曲常规操作的效率边界

STL系列专栏&#xff1a; C STL系列__Zwy的博客-CSDN博客https://blog.csdn.net/bite_zwy/category_12838593.html?spm1001.2014.3001.5482学习C STL的三个境界&#xff0c;会用&#xff0c;明理&#xff0c;能扩展&#xff0c;STL中的所有容器都遵循这个规律&#xff0c;下面…

AcWing 717. 简单斐波那契

文章目录 前言代码思路 前言 今天练习了半个小时的打字&#xff0c;还有点想继续练习&#xff0c;但是感觉还是不练了比较好。 简单题可能快要写完了&#xff0c;自己因为要做个手术回家几天&#xff0c;不想带电脑回去&#xff0c;好几天不能练习打字&#xff0c;要不今天再…

FPGA系列,文章目录

前言 FPGA&#xff08;Field-Programmable Gate Array&#xff0c;现场可编程门阵列&#xff09;是一种集成电路&#xff0c;其内部结构可以通过软件重新配置来实现不同的逻辑功能。与传统的ASIC&#xff08;Application-Specific Integrated Circuit&#xff0c;专用集成电路…

【Linux】软硬连接 | 静动态库

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;青果大战linux 总有光环在陨落&#xff0c;总有新星在闪烁 你说得对&#xff0c…

消防物证管理系统|DW-S404实现消防物证智能化管理

一、系统概述 智慧消防物证管理系统DW-S404系统旨在借助现代信息技术&#xff0c;达成消防物证管理的高效化、安全化及智能化管理目标。该系统运用物联网、大数据、云计算等先进技术&#xff0c;实现对消防物证从产生到销毁的全生命周期跟踪与监控&#xff0c;从而增强物证管理…

Java的封装、继承、多态

书接上文&#xff0c;我们聊完了Java的类和对象&#xff0c;有没有唤起你脑海的一些记忆呢&#xff0c;我们有了类和对象的基础之后&#xff0c;我们就可以衍生出来封装继承和多态。 封装 我理解一个东西&#xff0c;我一般会先想这个是什么&#xff0c;再是怎么用&#xff0…

【大数据技术基础 | 实验十四】Kafka实验:订阅推送示例

文章目录 一、实验目的二、实验要求三、实验原理&#xff08;一&#xff09;Kafka简介&#xff08;二&#xff09;Kafka使用场景 四、实验环境五、实验内容和步骤&#xff08;一&#xff09;配置各服务器之间的免密登录&#xff08;二&#xff09;安装ZooKeeper集群&#xff08…

操作系统Lesson7 - 线程编程模型和进程间通信概述

文章目录 进程和线程的区别线程非安全函数时序问题进程间通信竞态条件 进程和线程的区别 一句话&#xff1a;进程资源独立&#xff0c;线程资源共享。 当系统内核不支持线程时&#xff0c;我们只能用用户空间来描述线程&#xff1b;而如果内核支持线程&#xff0c;我们可以在创…

距离与AoA辅助的三维测距算法,适用于自适应基站数量的情况。订阅专栏后可直接查看完整源代码

本MATLAB 代码实现了一个基于距离与到达角(AoA)的三维测距系统,主要用于在动态环境中估计目标物体的位置。提供本算法与仅侧角(AoA)的定位误差对比 文章目录 代码运行结果源代码代码功能概述主要步骤分析初始化部分AOA定位绘图部分输出部分代码的应用和意义总结代码运行结…

dd破坏asm磁盘头恢复---惜分飞

有朋友对asm disk的磁盘头dd了2048byte的数据 通过分析,gi软件版本,确认是11.2.0.4 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production With the Real Application Clusters and Automatic Storage Management options. ORACLE_HOME /u01/app/…

网络测速工具

1. SPEEDTEST https://www.speedtest.net/ 2. 测速网 测速网 - 专业测网速, 网速测试, 宽带提速, 游戏测速, 直播测速, 5G测速, 物联网监测,Wi-Fi 7,Wi-Fi 6,FTTR,全屋Wi-Fi - SpeedTest.cn 3. 字节比特换算 bps&#xff08;bits per second&#xff09; 字节和比特的换算…

PDF处理的创新工具:福昕低代码平台尝鲜

在当今数字化时代&#xff0c;PDF文件的处理和管理变得越来越重要。福昕低代码平台是新发布的一款创新的工具&#xff0c;旨在简化PDF处理和管理的流程。通过这个平台&#xff0c;用户可以通过简单的拖拽界面上的按钮&#xff0c;轻松完成对Cloud API的调用工作流&#xff0c;而…