草庐IT

第2章-Spring基于XML配置的容器

码匠 2023-04-16 原文

目录

Spring 的核心功能就是提供一个 IoC 容器,用于管理应用程序中的 bean,在容器中配置元数据来管理 Bean 之间的依赖关系,Java 程序中的类都可以交由 Spring 容器管理。

一、Bean 管理

1. 元数据

配置 Spring 元数据的方式有三种:

  • 基于 XML 方式配置
  • 基于注解方式配置
  • 基于 Java 方式配置

Spring 最早的时候提供BeanFactory接口实现 Bean 容器,而后面新增的许多功能都是基于其子接口ApplicationContext来实现的,前面说的三种配置方式,可以使用下面三个实现类来实例化容器。

|interface BeanFactory (org.springframework.beans.factory)
|---interface ApplicationContext (org.springframework.context)
|---|---class FileSystemXmlApplicationContext (org.springframework.context.support)
|---|---class ClassPathXmlApplicationContext (org.springframework.context.support)
|---|---class AnnotationConfigApplicationContext (org.springframework.context.annotation)

例如使用 ClassPathXmlApplicationContext 来通过 classpath 目录下的配置文件实例化容器:

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");

2. Bean 实例化

在 Spring 容器中配置好的 Bean 都会被 Spring 自动实例化,以供在开发过程中注入直接可以使用,而不需要手动去 new 对象。

2.1 构造器实例化

Spring 容器默认使用类的无参构造器来实例化 Bean,也可以指定其他带参数的构造器来实例化。

<!--默认使用无参构造器-->
<bean id="beanProvider" class="cn.codeartist.spring.bean.xml.BeanProvider"/>

<!--使用其他构造器-->
<bean id="beanExample" class="cn.codeartist.spring.bean.xml.BeanExample">
    <constructor-arg index="0" value="码匠公众号"/>
    <constructor-arg index="1" value="2021"/>
    <constructor-arg index="2" ref="beanProvider"/>
</bean>

2.2 静态工厂方式实例化

Spring 容器支持使用静态工厂方法来实例化 Bean,在类中定义一个 static 方法来创建对象实例。

public class BeanExample {
    
    private static BeanExample beanExample = new BeanExample();

    public static BeanExample getInstance() {
        return beanExample;
    }
}

在 Bean 配置中使用 factory-method 属性来指定工厂方法。

<bean id="beanExample" class="...xml.BeanExample" factory-method="getInstance"/>

2.3 实例工厂方式实例化

和静态工厂方法一样,不同的是工厂方法是实例化后的 Bean 的方法而不是静态方法。

public class BeanExampleFactory {
    
    private static BeanExample beanExample = new BeanExample();

    public BeanExample getInstance() {
        return beanExample;
    }
}

在 Bean 配置中使用 factory-bean 属性指定工厂类的 Bean,使用 factory-method 属性来指定工厂方法。

<bean id="beanExample" class="...xml.BeanExample" factory-bean="beanExampleFactory" factory-method="getInstance"/>
<bean id="beanExampleFactory" class="cn.codeartist.spring.bean.xml.BeanExampleFactory"/>

3. Bean 作用域

通过 scope 属性配置 bean 的作用域,来指定 bean 的实例化作用范围。

<bean id="beanExample" class="...xml.BeanExample" scope="prototype"/>

常用的几种 Bean 作用域如下:

作用域 描述
singleton (默认)单例作用域,在 Spring 容器内部只创建一个实例
prototype 原型作用域,在容器中创建多个实例,每使用一次创建一个实例
request 请求作用域,在 Web 框架下单次请求创建一个实例
session 会话作用域,在 Web 框架下单次会话内创建一个实例
application 应用作用域,在 ServletContext 生命周期内创建一个实例

二、依赖注入

Spring 容器创建好了 Bean 实例后,会根据实例间的依赖关系来进行注入。

1. 依赖注入

1.1 构造器注入

通过类的构造器来注入依赖的值或 Bean。

<bean id="beanExample" class="...xml.BeanExample">
    <constructor-arg index="0" value="码匠公众号"/>
    <constructor-arg index="1" value="2021"/>
    <constructor-arg index="2" ref="beanProvider"/>
</bean>

1.2 Setter 方法注入

通过类的 Setter 方法注入依赖的值或 Bean。

<bean id="beanExample" class="...xml.BeanExample">
    <property name="name" value="码匠公众号"/>
    <property name="year" value="2021"/>
    <property name="beanProvider" ref="beanProvider"/>
</bean>

在两种注入方式中,配置值的方式:

  • value:注入值
  • ref:注入引用(注入 Bean 实例)

2. 依赖关系

一般情况下,Bean 之间的依赖关系并不明确,但在一些情况下,比如初始化一个静态类,使用 depends-on 属性指定在初始化该 bean 之前,强制初始化依赖的一个或多个 bean。

<bean id="beanExample" class="...xml.BeanExample" depends-on="beanProvider" />

3. 懒加载

一般情况下,Spring 会在容器启动的时候把所有 Bean 实例化完成,如果想在第一次使用的 Bean 的时候才初始化,可能配置 lazy-init 来实现。

<bean id="beanExample" class="...xml.BeanExample" lazy-init="true"/>

4. 自动注入

Spring 容器支持自动注入,而不需要手动通过 ref 来指定依赖的 bean 实例。

<bean id="beanExample" class="...xml.BeanExample" autowire="byName"/>

容器支持的注入方式:

注入方式 描述
no (默认)不使用自动注入
byName 通过 bean 名称注入
byType 通过 bean 类型注入
constructor 通过构造器参数类型注入

三、附录

1. 配置属性表

属性 默认值 描述
id - 指定 bean 的名称
class - 指定 bean 的类
scope singleton 指定作用域
depends-on - 指定依赖关系
lazy-init false 配置懒加载
autowire no 配置自动注入
factory-bean - 指定提供工厂方法的 bean
factory-method - 指定创建 bean 的工厂方法

2. 示例代码

Gitee 仓库:https://gitee.com/code_artist/spring

代码目录:src/main/java/cn/codeartist/spring/bean/xml

有关第2章-Spring基于XML配置的容器的更多相关文章

  1. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  2. ruby-on-rails - 独立 ruby​​ 脚本的配置文件 - 2

    我有一个在Linux服务器上运行的ruby​​脚本。它不使用rails或任何东西。它基本上是一个命令行ruby​​脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg

  3. ruby-on-rails - 带 Spring 锁的 Rails 4 控制台 - 2

    我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.

  4. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  5. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  6. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

  7. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  8. 神州数码无线产品(AC+AP)配置 - 2

    注意:本文主要掌握DCN自研无线产品的基本配置方法和注意事项,能够进行一般的项目实施、调试与运维AP基本配置命令AP登录用户名和密码均为:adminAP默认IP地址为:192.168.1.10AP默认情况下DHCP开启AP静态地址配置:setmanagementstatic-ip192.168.10.1AP开启/关闭DHCP功能:setmanagementdhcp-statusup/downAP设置默认网关:setstatic-ip-routegeteway192.168.10.254查看AP基本信息:getsystemgetmanagementgetmanaged-apgetrouteAP配

  9. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  10. hadoop安装之保姆级教程(二)之YARN的配置 - 2

    1.1.1 YARN的介绍 为克服Hadoop1.0中HDFS和MapReduce存在的各种问题⽽提出的,针对Hadoop1.0中的MapReduce在扩展性和多框架⽀持⽅⾯的不⾜,提出了全新的资源管理框架YARN. ApacheYARN(YetanotherResourceNegotiator的缩写)是Hadoop集群的资源管理系统,负责为计算程序提供服务器计算资源,相当于⼀个分布式的操作系统平台,⽽MapReduce等计算程序则相当于运⾏于操作系统之上的应⽤程序。 YARN被引⼊Hadoop2,最初是为了改善MapReduce的实现,但是因为具有⾜够的通⽤性,同样可以⽀持其他的分布式计算模

随机推荐