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;
    }

    @Override
    public 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/beans
                           http://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/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/context
                           http://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,则抛出异常。

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

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

相关文章

圆通开放平台快递物流查询API对接流程

作为一家深受用户信赖的快递物流服务商&#xff0c;圆通快递通过开放平台为用户提供高效的快递物流查询API。圆通开放平台是将圆通下单、轨迹、工单及基础服多种服务接口通过开放平台赋能客户&#xff0c;帮助客户快速建立全面的物流解决方案的共联平台。平台现有接口文档统一管…

如何防御ARP欺骗 保护IP安全

在数字化浪潮席卷全球的今天&#xff0c;网络安全威胁如同暗流涌动&#xff0c;时刻考验着我们的防范能力。其中&#xff0c;ARP欺骗攻击作为一种隐蔽性强、成本低廉且危害严重的网络攻击手段&#xff0c;成为众多网络安全事件中的一颗“毒瘤”。那么我们究竟是如何防御ARP欺骗…

云数据库 HBase

HBase 是一个分布式、可扩展的列式 NoSQL 数据库&#xff0c;源自 Google 的 Bigtable 论文&#xff0c;并是 Apache Hadoop 生态系统的一部分。它特别适用于需要处理大规模数据集的场景&#xff0c;尤其是那些要求高吞吐量和低延迟的数据访问。HBase 支持分布式存储&#xff0…

泷羽sec学习打卡-shell命令8

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都 与本人无关,切莫逾越法律红线,否则后果自负 关于shell的那些事儿-shell8 until循环(直到为止)case语句func函数定义实践是检验真理的唯一标准 别问&…

车机端同步outlook日历

最近在开发一个车机上的日历助手&#xff0c;其中一个需求就是要实现手机端日历和车机端日历数据的同步。然而这种需求似乎没办法实现&#xff0c;毕竟手机日历是手机厂商自己带的系统应用&#xff0c;根本不能和车机端实现数据同步的。 那么只能去其他公共的平台寻求一些机会&…

从零开始学TiDB(1) 核心组件架构概述

首先TiDB深度兼容MySQL 5.7 1. TiDB Server SQL语句的解析与编译&#xff1a;首先一条SQL语句最先到达的地方是TiDB Server集群&#xff0c;TiDB Server是无状态的&#xff0c;不存储数据&#xff0c;SQL 发过来之后TiDB Server 负责 解析&#xff0c;优化&#xff0c;编译 这…

Linux絮絮叨(三) Ubuntu桌面版添加中文拼音输入法

步骤很详细&#xff0c;直接上教程 一. 配置安装简体拼音输入法 #安装相应的平台支持包 sudo apt install ibus-gtk ibus-gtk3# 安装简体拼音输入法 sudo apt install ibus-pinyin安装完成如果下面的步骤找不到对应输入法可以重启一下&#xff0c;一般不需要 二. 添加简体拼音…

RTCMultiConnection 跨域问题解决

js套件地址 https://github.com/muaz-khan/RTCMultiConnection server套件地址 https://github.com/muaz-khan/RTCMultiConnection-Server 要解决的就是server代码的跨域问题 原装写法&#xff1a; 解决写法&#xff1a; // 喜欢组合语法的自己组 const io new ioServer.S…

在 Zemax 中使用 CAD 镜头的逆向血眼模型

Zemax 中的眼睛模型涉及模拟人眼的光学特性。该模型通常包括代表角膜、晶状体、房水、玻璃体和视网膜的各种成分。 屈光不正的眼睛是具有屈光不正的眼睛&#xff0c;这意味着它不能将光线正确聚焦在视网膜上&#xff0c;导致视力模糊。屈光不正是存在屈光不正的状态&#xff0…

WebStorm快捷键保持跟Idea一致

修改连续行局部多选 在WebStorm中同时按下ctrl alt s&#xff1b; 选择KeyMap 输入Column Selection Mode选择快捷键, 右键选择Add Mouse Shortcut 按下alt 鼠标左键 如果出现占用的情况&#xff0c;直接删除其他使用该快捷键的地方即可&#xff1b; 修改跨行局部多选 在…

如何查看电脑的屏幕刷新率?

1、按一下键盘的 win i 键&#xff0c;打开如下界面&#xff0c;选择【系统】&#xff1a; 2、选择【屏幕】-【高级显示设置】 如下位置&#xff0c;显示屏幕的刷新率&#xff1a;60Hz 如果可以更改&#xff0c;则选择更高的刷新率&#xff0c;有助于电脑使用起来界面更加流…

【AI模型对比】Kimi与ChatGPT的差距:真实对比它们在六大题型中的全面表现!

文章目录 Moss前沿AI语义理解文学知识数学计算天文学知识物理学知识英语阅读理解详细对比列表总结与建议 Moss前沿AI 【OpenAI】获取OpenAI API Key的多种方式全攻略&#xff1a;从入门到精通&#xff0c;再到详解教程&#xff01;&#xff01; 【VScode】VSCode中的智能AI-G…

WPF编写工业相机镜头选型程序

该程序满足面阵和线阵的要求。 前端代码 <Window x:Class"相机镜头选型.MainWindow" Loaded"Window_Loaded"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml…

若依 ruoyi VUE el-select 直接获取 选择option 的 label和value

1、最新在研究若依这个项目&#xff0c;我使用的是前后端分离的方案&#xff0c;RuoYi-Vue-fast(后端) RuoYi-Vue-->ruoyi-ui(前端)。RuoYi-Vue-fast是单应用版本没有区分那么多的modules 自己开发起来很方便&#xff0c;这个项目运行起来很方便&#xff0c;但是需要自定义的…

【深入探索 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;下面…

DevOps系统设计和技术选型

命名是一件痛苦的事情&#xff0c;除非你不想要一个好名字。 我正在做的这个管理系统叫什么合适&#xff0c;或者是什么类型的系统&#xff0c;想去想来不知所措&#xff0c;后来想想这么小的东西纠结什么&#xff0c;先从小的细节一点点来&#xff0c;能用就行&#xff0c;就用…

20241206-Windows 10下使用IDEA 2024.2.3(JDK 18.0.2.1)搭建Hadoop 3.3.6开发环境

Windows 10下使用IDEA 2024.2.3(JDK 18.0.2.1)搭建Hadoop 3.3.6开发环境 1. 配置好本地hadoop之后 2. idea 新建或导入 Maven 项目 3. 编写 pom.xml 文件: 有些版本和项目信息需要根据自己的项目进行调整 JDK 18.0.2.1 Hadoop 3.3.6 <?xml version"1.0" encod…

C#Treeview

创建一个Windows应用程序&#xff0c;在默认窗体中添加一个TreeView控件、一个ImageList控件和一个ContextMenuStrip控件&#xff0c;其中&#xff0c;TreeView控件用来显示部门结构&#xff0c;ImageList控件用来存储TreeView控件中用到的图片文件&#xff0c;ContextMenuStri…

pytorch多GPU训练教程

pytorch多GPU训练教程 文章目录 pytorch多GPU训练教程1. Torch 的两种并行化模型封装1.1 DataParallel1.2 DistributedDataParallel 2. 多GPU训练的三种架构组织方式2.2 数据不拆分&#xff0c;模型拆分&#xff08;Model Parallelism&#xff09;2.3 数据拆分&#xff0c;模型…

使用el-row和el-col混合table设计栅格化,实现表头自适应宽度,表格高度占位

演示效果&#xff1a; 如上图,由于地址信息很长,需要占多个格子,所以需要错开,若想实现这种混合效果,可以这样搭建: 页面效果&#xff1a; 代码分析: 上面使用el-row和el-col搭建表单显示 第一排三个8,第二排8和16 下面混合table实现&#xff0c;并使用border来自适应宽度…