spring学习(XML中定义与配置bean(超详细)。IoC与DI入门spring案例)

news2024/12/17 9:16:07

目录

一、配置文件(XML)中定义与配置bean。

(1)bean的基础配置。(id、class)

(2)bean的别名配置。

1、基本介绍。

2、demo测试。

3、NoSuchBeanDefinitionException!

(3)bean作用范围配置。

1、基本介绍。

2、demo测试。

3、为什么spring容器默认bean为singleton(单例)?

<1>基本解释。

<2>适合交给spring容器管理的bean。

<3>不适合交给容器进行管理的bean。

(4)bean其他属性配置(初始化、销毁等等)

二、IoC与DI的入门案例。

(1)demo的前提须知。

1、项目准备工作。

2、项目要求。

3、spring提供的二种容器(实例化与管理bean)。

(2)pom文件引入(spring-context)坐标依赖。

(3)spring配置文件(配置相应bean)。

(4)实体类"A"、实体类"B"。

1、ApplicationContext(IoC容器)。

2、BeanFactory(Bean工厂)。

(5)运行结果。


一、配置文件(XML)中定义与配置bean。

(1)bean的基础配置。(id、class)
  • bean基本属性。(表格)

类别基本描述
名称bean
类型标签(<bean>)
所属标签<beans>内
功能简介定义spring核心容器的管理的对象
格式
 

(位于spring配置文中)
<?xml .....>
<beans>
     <bean/>

     或
     <bean></bean>(常用)
<beans>

基本属性id:bean的id(唯一标识)。使用spring容器可以通过id值获取对应的bean,在一个容器中id的值是唯一的
class:bean的类型。配置的是bean的全路径类名
基本示例
(controlle层)
(service层)
<!--配置UserService对象-->
<bean id="userService" class="com.fs.service.UserService"></bean>

<!--配置UserController对象-->
<bean id="userController" class="com.fs.controller.UserController">
    <!--配置属性值(通过setter方式实现依赖注入)-->
    <property name="userService" ref="userService"></property>
</bean>

(2)bean的别名配置。
1、基本介绍。
  • 属性名:name。
  • 与id的功能基本一致。其中别名可以与id一起出现,且可以有多个,使用逗号隔开
类别描述
名称name
类型属性
所属标签<bean>的基本属性
功能

定义bean的别名

可以定义多个,且可以使用逗号(,)、分号(;)、空格进行分隔

示例
<!--配置生产UserService对象-->
<!--id只能有一个,name(别名)可以多个-->
<bean id="userService" name="service" class="com.fs.service.UserService">
</bean>

<!--配置生产UserController对象-->
<!--id只能有一个,name(别名)可以多个-->
<bean id="userController" 
name="controller controller2" class="com.fs.controller.UserController">
</bean>
异常获取bean无论是通过id还是name获取,如果无法获取到,将抛出异常!NoSuchBeanDefinitionException

2、demo测试。
  • 如下。service注入controller层
  • UserService中的测试方法(main)使用ApplicationContext(IoC容器)管理bean、bean与bean之间的依赖关系
package com.fs.controller;

import com.fs.service.UserService;
import org.springframework.context.support.ClassPathXmlApplicationContext;
// UserController类
public class UserController {
    
    //service依赖注入
    UserService userService;

    public void setUserService(UserService userService) {
        this.userService = userService;
    }
    
    //UserController类的print方法
    public void print(){
        System.out.println("UserController的print方法");
        userService.print();
    }
    //测试spring容器管理bean的main方法
    public static void main(String[] args) {
        //创建容器
        ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("springConfig.xml");
        //通过spring工厂获取指定bean对象
        UserController userController = app.getBean("userController", UserController.class);
        /*UserController userController = new UserController(); 取消这种手动new对象的操作*/
        userController.print();
    }
}
package com.fs.service;
// UserService类
public class UserService {
    //UserService类的成员方法
    public void print(){
        System.out.println("UserService的print方法");
    }
}
  • 测试类(MainApp)。使用BeanFactory管理bean、bean与bean之间的依赖关系
package com.fs;

import com.fs.controller.UserController;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;

public class MainApp {
    public static void main(String[] args) {
        
        //使用BeanFactory工厂实现IoC、DI(依赖注入与控制反转)
        //使用DefaultListableBeanFactory(BeanFactory的实现类)
        DefaultListableBeanFactory defaultListableBeanFactory = new DefaultListableBeanFactory();
        //加载配置清单
        XmlBeanDefinitionReader xmlBeanDefinitionReader = new XmlBeanDefinitionReader(defaultListableBeanFactory);
        xmlBeanDefinitionReader.loadBeanDefinitions("springConfig.xml");
        Object obj = defaultListableBeanFactory.getBean("userController");
        UserController userController = (UserController) obj;
        userController.print();

    }
}
  • spring配置文件。(管理UserService、UserController类的bean)
<?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">

    <!--配置生产UserService对象-->
    <bean id="userService" class="com.fs.service.UserService"></bean>

    <!--配置生产UserController对象-->
    <bean id="userController" class="com.fs.controller.UserController">
        <!--配置属性值-->
        <property name="userService" ref="userService"></property>
    </bean>
</beans>
  • 运行结果。



  • 使用别名。

<!--配置生产UserController对象-->
<!--id只能有一个,name(别名)可以多个-->
    <bean id="userController" name="controller controller2" class="com.fs.controller.UserController">
        <!--配置属性值-->
        <property name="userService" ref="userService"></property>
    </bean>
  • 测试结果。



  • 对应ref属性值最好使用id属性对应的值。但是也可以使用name属性对应的值!(ref:在依赖注入中使用到的)


3、NoSuchBeanDefinitionException!
  • 表示在spring容器中未找到指定的Bean定义这个异常在spring框架的学习或者实战中很常见!
  • 以后一旦出现了就要查看:向spring容器getBean()获取对象时的参数bean的id或name属性是否写对?其次就是spring配置文件中的<bean>标签的id或name属性是否写对?


(3)bean作用范围配置。
1、基本介绍。
  • 所谓的bean的作用范围(scope)——简单情况:当前spring容器创建的bean是单例的还是非单例。也就是一个对象还是多个对象。
  • 可以通过scope属性来设置bean的作用域,它的取值有以下几个(基本介绍)。
类别描述
名称scope
类型属性
所属标签<bean>的基本属性
基本功能

定义bean的作用范围。其实是控制bean创建的实例的数量!
主要的范围可选如下:

  • singleton:单例(默认)。每次调用getBean()都返回同一个bean对象。
  • prototype:原型。每次从spring容器调用getBean()返回一个新的bean对象。相当于执行newXxxBean()。

  • request与session仅适用于WebApplicationContext环境
  • request。(每次HTTP请求都会实例化一个新的bean)
  • session。同一个HttpSession共享一个bean。不同HttpSession使用不同的bena。
  • 等等。
     
示例
<bean id="userController" name="controller" class="com.fs.controller.UserController" scope="prototype">
</bean>

  • 通过scope属性来设置bean的作用域,它的取值有以下几个(基本介绍)


2、demo测试。
  • 改进一下上面的代码。getBean()获取对象后打印多次!查看其地址是否一致。
//测试spring容器管理bean的main方法
    public static void main(String[] args) {
        //创建容器
        ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("springConfig.xml");
        //通过spring工厂获取指定bean对象
        UserController userController = app.getBean("userController", UserController.class);
        UserController userController2 = app.getBean("userController", UserController.class);
        System.out.println(userController);
        System.out.println(userController2);
    }
  • 测试结果如下。结论:spring容器默认生产的是单例的对象。(也就是是同一个对象)

  • 为bean标签内添加属性"scope",并赋值"prototype"。(改成非单例)



3、为什么spring容器默认bean为singleton(单例)?
<1>基本解释。
  • 对应spring容器,它帮程序员管理的bean对象需要放到容器中,如果不是单例的,那么它的容器里就需要装下无穷无尽的bean。(用一次造一次新的bean)这样spring容器会有很大的压力。
  • 如果执行dao层方法需要造一个对象,下一次执行dao层方法又要造一次,可以想想这种情景下使用同一个bean对象也是同样可以满足的。
  • 其实spring为我们管理的就是那些可以复用的对象。就是某个对象用一次,下一次还是从容器中拿取并用同样的它。这样的效率会提升很大!

<2>适合交给spring容器管理的bean。
  • 表现层对象。(Servlet)
  • 业务层对象。(service层)
  • 数据层对象。(Dao、Mapper层)
  • 工具类对象。

  • 上面这些对象在实际开发中造一次就ok了,一直使用同一个对象即可完成操作。


<3>不适合交给容器进行管理的bean。
  • 封装实体类对象。(比如某个对象封装的数据是1,下一次就可能封装的数据2,这种对象就不合适交给spring容器管理)

(4)bean其他属性配置(初始化、销毁等等)
  • 使用<bean>标签内的属性:init-method="初始化方法"、destroy-method="销毁方法"。
  • 详细的可能在后面的bean生命周期提到!

二、IoC与DI的入门案例。

  • 简单使用spring完成IoC与DI的入门案例。
(1)demo的前提须知。
1、项目准备工作。
  • 该工程有三个包:T包(测试包)、a包、b包。
  • a包中有类"A",类"A"中有一个成员方法sum()。b包中有一个类"B",类"B"中有成员方法jisuan()。

2、项目要求。
  • 要求:将类"A"与类"B"对象的实例化与对象间的依赖交给外部容器管理(spring管理)。也就是不能通过手动的new它们的对象就完成操作。
  • 使用spring的核心思想(IoC、DI)完成该案例。涉及的两种spring容器(ApplicationContext容器、BeanFactory(Bean工厂))


3、spring提供的二种容器(实例化与管理bean)。
  • spring容器是spring框架的核心。IoC容器具有依赖注入(DI)功能的容器。它可以创建对象,IoC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。
  • 通常new一个实例,控制权由程序员控制,而"IoC(控制反转)"是指new实例工作不由程序员来做而是交给Spring容器来做。


(2)pom文件引入(spring-context)坐标依赖。
  • Maven本地仓库:https://mvnrepository.com/search?q=spring-context
  • 导入spring-context的坐标。


  • 选择对应合适的版本。


  • 复制依赖(spring-context)的坐标即可。


  • pom.xml文件中引入依赖(spring-context)坐标。导入完记得刷新Maven。


(3)spring配置文件(配置相应bean)。
  • 本项目的demo的配置文件:springBean.xml。
  • 在resources目录下新建spring.xml(配置文件)。

  • 注意:只有导入spring-context依赖的前提下,才会有这个"Spring 配置"的创建选项。

  • 使用<bean>标签配置spring容器需要管理的bean(a包类"A"与b包类"B")。
<?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">
    <!--配置生产a包下的A类对象-->
    <bean id="A" class="com.fs.a.A" scope="prototype">
        <property name="b" ref="B"></property>
    </bean>
    <!--配置生产b包下的B类对象-->
    <bean id="B" class="com.fs.b.B"></bean>
</beans>
(4)实体类"A"、实体类"B"。
1、ApplicationContext(IoC容器)。
  • 在实体类"A"中的main()方法测试:使用spring的ApplicationContext容器的实现类"ClassPathXmlApplicationContext"类进行读取spring配置文件。通过getBean()方法获取类"A"对象的实例。

  • 通过spring容器组件(对象)间的依赖管理(依赖注入DI)完成类"B"对象实例。


  • spring配置文件中配置依赖关系
  • 在spring配置文件中的<bean>内部使用<property>标签指定:属性name(对应类"A"中的成员变量b(类"B"的对象))、属性ref(对应spring管理的类"B"的id(唯一标识))


  • 因为类"A"中有一个类"B"的成员属性。还需要通过手动提供对应的setter方法完成类"B"的依赖注入。(需要注入的对象提供setter方法
  • spring的类"A"与类"B"的bean管理已经在spring配置文件中写好,并且之间的依赖管理也已标明。

package com.fs.a;

import com.fs.b.B;
import org.springframework.context.support.ClassPathXmlApplicationContext;
//A类
public class A {
    //需要依赖注入的成员变量
    B b;

   //提供对于需要依赖注入的成员变量b的setter方法
    public void setB(B b) {
        this.b = b;
    }

    //A类的sum()方法
    public void sum(){
        System.out.println("A类的计算方法");
        //通过类"A"的bean对象实例化时的依赖注入(DI)类"B"对象
        //再调用B类的jisuan()方法
        b.jisuan();
    }

    //A类的mian()方法
    public static void main(String[] args) {
        //使用IoC容器(ApplicationContext)获取spring容器管理的bean对象
        //1.创建容器对象。实例化时参数指定对应的配置文件
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("springBean.xml");
        //2.通过<bean>标签的唯一标识id获取对应类"A"的实例对象
        Object obj = context.getBean("A");
        //3.强制类型转换
        A a = (A)obj;
        //4.调用A类的sum()方法
        a.sum();
    }
}

package com.fs.b;
//类B
public class B{

    //B类的计算方法
    public void jisuan(){
        System.out.println("B类的计算方法");
    }

}
2、BeanFactory(Bean工厂)。
  • 在T包的测试类中,第1步,使用BeanFactory的实现类"DefaultListableBeanFactory"来创建Bean工厂对象。
  • 比起ApplicationContext的实现类"ClassPathXmlApplicationContext"容器拿取spring容器管理的bean对象需要多出一点步骤!
  • 第2步。需要使用类"XmlBeanDefinitionReader"的对象获取读取配置文件的类,记得传入参数(上面创建的Bean工厂实现类的对象)。
  • 第3步。调用loadBeanDefinitions()方法加载配置文件。方法内部参数:spring配置文件名。
  • 第4步。通过getBean()方法获取spring管理的对象"A"。

  • 使用spring的ApplicationContext容器管理类"A"对象的实例。通过spring容器组件(对象)间的依赖管理(依赖注入DI)完成类"B"对象实例。
package com.fs.T;

import com.fs.a.A;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
//测试类
public class Main {
    public static void main(String[] args) {
        //使用bean工厂的实现类实例化对象
        DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
        //实例化类XmlBeanDefinitionReader(读取配置文件类)
        XmlBeanDefinitionReader xmlBeanDefinitionReader = new XmlBeanDefinitionReader(factory);
        //加载配置文件
        xmlBeanDefinitionReader.loadBeanDefinitions("springConfig.xml");
        //也是通过<bean>标签的唯一标识id获取对应类"A"的实例对象
        A a2 = (A)factory.getBean("A");
        //调用A类的sum()方法
        a2.sum();
    }
}
(5)运行结果。
  • ApplicationContext(IoC容器)管理bean。

  • BeanFactory(Bean工厂)管理bean。

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

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

相关文章

Docker容器编排与Docker Compose

1. Docker Compose介绍与基础概念 Docker Compose是一个用于定义和运行多容器Docker应用的工具。通过Compose&#xff0c;用户可以用YAML文件来定义多个容器的服务、网络、存储等配置&#xff0c;并通过一个命令来启动、停止和管理这些容器。它简化了多容器应用的管理&#xf…

鸿蒙项目云捐助第七讲鸿蒙App应用的首页推荐模块布局的实现

鸿蒙项目云捐助第七讲鸿蒙App应用的首页推荐模块布局的实现 最后设置首页的推荐模块&#xff0c;参考模板如下图所示。 一、首页热门推荐模块的实现 对于热门推荐模块&#xff0c;先有上面的小标题栏&#xff0c;这里的标题栏也有一个小图标&#xff0c;首先从“百度图库”中…

MySQL八股-MVCC入门

文章目录 当前读&#xff08;加锁&#xff09;快照读&#xff08;不加锁&#xff09;MVCC隐藏字段undo-log版本链A. 第一步B.第二步C. 第三步 readview MVCC原理分析RCA. 先来看第一次快照读具体的读取过程&#xff1a;B. 再来看第二次快照读具体的读取过程: RR隔离级别 当前读…

基于单片机的无绳跳绳设计

基于单片机设计了一款无绳跳绳&#xff0c;采用传感器代替了绳子的摆动&#xff0c;从而实现了模拟跳绳的功能。其研究的方法是&#xff1a;以单片机作为这次设计的核心&#xff0c;它的外围包含有传感器模块、按键模块、显示模块、语音播报模块及电源模块等。本设计采用STM32芯…

【图像处理】利用numpy实现直方图均衡、自适应直方图均衡、对比度受限自适应直方图均衡

直方图均衡化是一种在图像处理技术&#xff0c;通过调整图像的直方图来增强图像的对比度。 本博客不利用opencv库&#xff0c;仅利用numpy、matplotlib来实现直方图均衡、自适应直方图均衡、对比度受限自适应直方图均衡 直方图均衡 包括四个流程 计算图像RGB三通道的归一化直…

Azure Function流式返回

最近用azure function做了一个api和llm交互&#xff0c;需要流式返回。但是默认不支持流返回&#xff0c;搜索了一下。记录。 官方文档&#xff1a;https://techcommunity.microsoft.com/blog/azurecompute/azure-functions-support-for-http-streams-in-python-is-now-in-prev…

【软件工程】简答题系列(一)(山东大学·软院考试专属)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;软件开发必练内功_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前…

WebGIS城市停水及影响范围可视化实践

目录 前言 一、相关信息介绍 1、停水信息的来源 2、停水包含的相关信息 二、功能简介 1、基础小区的整理 2、停水计划的管理 三、WebGIS空间可视化 1、使用到的组件 2、停水计划的展示 3、影响小区的展示 4、实际效果 四、总结 前言 城市停水&#xff0c;一个看似…

数据结构,链表的简单使用

任意位置删除&#xff1a; void Any_Del(LinkListPtr h,int a)//任意删 {if(NULLh||a>h->len){printf("删除失败");}LinkListPtr ph;for(int i0;i<a-1;i){pp->next;}LinkListPtr p2p;p2p2->next;p->nextp->next->next;free(p2);p2NULL;h-&g…

组织空转数据(人类+小鼠)

空间转录组&#xff08;Spatial Transcriptomics&#xff09;是一种新兴的高通量基因组学技术&#xff0c;它允许我们在组织切片中同时获取基因表达信息和细胞的空间位置信息。其可以帮助我们更好地理解细胞在组织中的空间分布和相互作用&#xff0c;揭示组织发育、器官功能和疾…

人工智能增强的音频和聊天协作服务

论文标题&#xff1a;AI-enabled Audio and Chat Collaboration Services 中文标题&#xff1a;人工智能增强的音频和聊天协作服务 作者信息&#xff1a; Emil P. Andersen, Norwegian Defence Research Establishment (FFI), Kjeller, NorwayJesper R. Goksr, Sindre E. Ha…

【操作系统1】一篇文章便可入门操作系统

操作系统 (Operating System,OS)是一种系统软件&#xff0c;它负责管理计算机的硬件和软件资源。它的主要任务是组织和调度计算机的工作&#xff0c;并分配资源给用户和其他软件。操作系统为用户和软件提供了方便的接口和环境。它是计算机系统中最基本的软件之一。 一、操作系…

51c嵌入式~单片机~合集3

我自己的原文哦~ https://blog.51cto.com/whaosoft/12362395 一、STM32代码远程升级之IAP编程 IAP是什么 有时项目上需要远程升级单片机程序&#xff0c;此时需要接触到IAP编程。 IAP即为In Application Programming&#xff0c;解释为在应用中编程&#xff0c;用户自己的…

ComfyUI 与 Stable Diffusion WebUI 的优缺点比较

ComfyUI与Stable Diffusion WebUI都是AI绘画领域比较知名两款产品&#xff0c;两者存在诸多差异&#xff0c;本篇就带你熟悉二者的优劣&#xff0c;方便自己做出决策。 界面与操作 ComfyUI&#xff1a;界面简洁直观&#xff0c;通过节点和连线的方式构建工作流&#xff0c;用…

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(三)

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(三) 你好,我是拉依达。 感谢所有阅读关注我的同学支持,目前博客累计阅读 27w,关注1.5w人。其中博客《最全Linux驱动开发全流程详细解析(持续更新)-CSDN博客》已经是 Linux驱动 相关内容搜索的推荐首位,感谢大家支持。 《拉…

Please activate LaTeX Workshop sidebar item to render the thumbnail of a PDF

Latex代码中使用pdf图片&#xff0c;无法预览&#xff0c;提示&#xff1a; Please activate LaTeX Workshop sidebar item to render the thumbnail of a PDF 解决办法&#xff1a; 点击左边这个刷新下即可

从数据到洞察:年度数据分析实战指南

在当今数据驱动的时代&#xff0c;年度数据分析已成为企业战略规划与运营优化的核心环节。通过对海量数据的深入挖掘与分析&#xff0c;企业能够准确把握市场动态、用户行为、产品性能等多维度信息&#xff0c;进而制定更加精准有效的策略。本文将从数据收集、处理、分析到应用…

虚拟机安装+XS hell+Xfit(安装方法大致都相同,若不一样,可看其他的)

一、虚拟机 &#xff08;一&#xff09;虚拟机 虚拟机&#xff08; Virtual Machine &#xff09;通过软件模拟的完整的计算机系统。 是运行在一个完全隔离的环境中的计算机系统。通俗的讲就是虚拟出来的电脑&#xff0c;这个虚拟处理的电脑和 真实的电脑几乎一模一样&#…

RabbitMQ实现消息发送接收——实战篇(路由模式)

本篇博文将带领大家一起学习rabbitMQ如何进行消息发送接收&#xff0c;我也是在写项目的时候边学边写&#xff0c;有不足的地方希望在评论区留下你的建议&#xff0c;我们一起讨论学习呀~ 需求背景 先说一下我的项目需求背景&#xff0c;社区之间可以进行物资借用&#xff0c…

ubuntu上更改ext4格式的硬盘为 windows的 NTFS 格式参考

1. ubuntu上安装 sudo apt-get install gparted 2. 参考如下&#xff0c;下面是转换后的样例。 3.windows上添加识别新硬盘参考 先在设备管理器中 找到下面 磁盘管理 如下&#xff1a;找到类似下面的磁盘2 查看相关信息 右键可以新建卷和格式化&#xff0c;下面是已经新建…