[Spring学习]04 Spring IOC创建Bean的几种方式

2023-11-09

一、调用构造器创建Bean对象

通过调用构造器创建Bean对象是我们在实际开发中最常用的方式,而构造器创建Bean对象又有两种方式:

1)通过无参构造方法创建

其本质是 SpringContext 利用无参的构造函数创建一个对象,然后利用setter方法进行赋值,所以要提供无参数构造函数,并定义对应字段的setter方法。如果无参构造函数不存在,Spring上下文创建对象的时候便会报错。
类User.java示例代码:

package priv.ioc.bean;

public class User {
	
	private String name;
	public User() {
        System.out.println("User的无参构造方法");
    }
	public void setName(String name) {
        System.out.println(name);
        this.name = name;
    }
	
}

xml配置bean时使用:

<property  name="属性名"  value="值" ></property>

标签对属性进行赋值。

Bean.xml示例代码:

 <!--无参构造,执行set方法-->
    <bean id="user" class="priv.ioc.bean.User">
        <property name="name" value="张三"/>
    </bean>

好像是执行的有参构造,但其实是执行了无参构造方法,然后通过set方法将name赋值进去的,类似执行了这样的代码:

User user = new User();
user.setName("张三");

2)通过有参构造方法创建

通过有参构造方法创建,有三种方式:

  1. 通过参数下标进行赋值

类User.java示例代码:

package priv.ioc.bean;

public class User {
	
	private String name;
	private int age;
	public User(String name, int age) {
        System.out.println("User的有参构造方法");
        this.name = name;
        this.age = age;
    }
	
}

Bean.xml示例代码:

    <!--有参构造:下标进行赋值-->
    <bean id="user" class="priv.ioc.bean.User">
         <constructor-arg index="0" value="张三"/>
         <constructor-arg index="1" value="28"/>
    </bean>
  1. 通过参数名称进行赋值

类User.java示例代码:

package priv.ioc.bean;

public class User {
	
	private String name;
	private int age;
	public User(String name, int age) {
        System.out.println("User的有参构造方法");
        this.name = name;
        this.age = age;
    }
	
}

Bean.xml示例代码:

    <!--有参构造:名称进行赋值-->
    <bean id="user" class="priv.ioc.bean.User">
         <constructor-arg name="name" value="张三"/>
         <constructor-arg name="age" value="28"/>
    </bean>
  1. 通过参数类型进行赋值

类User.java示例代码:

package priv.ioc.bean;

public class User {
	
	private String name;
	private int age;
	public User(String name, int age) {
        System.out.println("User的有参构造方法");
        this.name = name;
        this.age = age;
    }
	
}

Bean.xml示例代码:

    <!--有参构造:类型进行赋值-->
    <bean id="user" class="priv.ioc.bean.User">
         <constructor-arg type="java.lang.String" value="张三"/>
         <constructor-arg type="java.lang.Integer" value="28"/>
    </bean>

二、调用静态工厂方法创建Bean对象

类User.java示例代码:

package priv.ioc.bean;

public class User {
	
	private String name;
	private int age;
	public User(String name, int age) {
        System.out.println("User的有参构造方法");
        this.name = name;
        this.age = age;
    }
	
}

定义静态工厂方法:

package priv.ioc.factory;

import priv.ioc.bean.User;

public class UserFactory {

	public static User createPerson(String name,Integer age) {
		return new User(name, age);
	}
}

Bean.xml示例代码:

    <!-- 静态工厂方法 -->
	<bean id="user" class="priv.ioc.factory.UserFactory" factory-method="createPerson">
	    <constructor-arg name="name" value="张三" />
	    <constructor-arg name="age" value="28" />
	</bean>

class:priv.ioc.factory.UserFactory,指定静态工厂的实现类( 即包名.类名 )

factory-method:createPerson,该属性指定静态工厂的方法(方法名)

三、调用实例(动态)工厂方法创建Bean对象

类User.java示例代码:

package priv.ioc.bean;

public class User {
	
	private String name;
	private int age;
	public User(String name, int age) {
        System.out.println("User的有参构造方法");
        this.name = name;
        this.age = age;
    }
	
}

定义动态工厂方法:

package priv.ioc.factory;

import priv.ioc.bean.User;

public class UserFactory {

	public User createPerson(String name,Integer age) {
		return new User(name, age);
	}
}

Bean.xml示例代码:

     <!-- 先配置工厂Bean,class指定该工厂的实现类,该Bean负责产生其他Bean实例 --> 
	 <bean id="userFactory" class="priv.ioc.factory.UserFactory"/> 
	 
	 <!-- 再引用工厂Bean来配置其它的Bean -->
	 <bean id="user"  factory-bean="userFactory"  factory-method="createPerson">
	    <constructor-arg name="name" value="张三" />
	    <constructor-arg name="age" value="28" />
	 </bean>

factory-bean :userFactory,该属性指定工厂Bean的id

factory-method:createPerson,该属性指定实例工厂的方法(方法名)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[Spring学习]04 Spring IOC创建Bean的几种方式 的相关文章

随机推荐

  • 异常的笔记

    异常 很重要 有利于我们平时处理问题 异常就是代表程序出现了问题 常见的异常比如说 数组越界 除法除0 异常的体系是什么 java lang Throwable Error Exception RuntimeException 其他异常 E
  • UE4 Niagara粒子系统基础笔记

    目录 Niagara基础概念 Niagara官方建议 Niagara堆栈面板 Niagara渲染模式 材质 Niagara和蓝图 Niagara常用模块 Niagara常用技巧 Niagara ModuleScript Niagara基础概
  • RTP和RTCP详解

    1 RTP和RTCP详解 文章目录 1 RTP和RTCP详解 1 1 概述 1 2 RTP协议详解 1 3 RTCP协议详解 1 1 概述 在流媒体相关的领域 我们进场会看到RTP RTCP 其用于流式传输的最常见的码流传输协议 位于传输层
  • Python单元测试:pytest

    pytest默认使用的是main system packages 如果需要在虚拟环境中运行 需要运行 python m pytest test py 如果需要打印中间结果 pytest test py s
  • 跨时钟域电路设计——多bit信号&FIFO

    多个bit信号的跨时钟域仅仅通过简单的同步器同步时不安全的 如下图 虽然信号都同步到目的时钟域 可完成的功能却与设计的初衷不相符 解决方案之一为对信号进行格雷码编码 但此方案只适用于连续变化的信号 另一种方案为增加新的控制信号en 确保传输
  • 机器学习和深度学习引用量最高的20篇论文(2014-2017)

    机器学习和深度学习的研究进展正深刻变革着人类的技术 本文列出了自 2014 年以来这两个领域发表的最重要 被引用次数最多 的 20 篇科学论文 以飨读者 机器学习 尤其是其子领域深度学习 在近些年来取得了许多惊人的进展 重要的研究论文可能带
  • 1200兆路由器网速_家庭网络配置问题案例:六类网线上网速度只有100兆

    有这样一个案例 家中布置了一根6类网线 8芯中间带个塑料十字的双绞线 网线约10米长 全部为埋地管道暗线 水晶头为568B线序 电脑插也为6类 西门子 568B线序接法 现在出现一个问题 就是网线一个连接移动光猫 为路由器模式 千兆口 然后
  • mac-右键-用VSCode打开

    1 点击访达 搜索自动操作 2 选择快速操作 3 执行shell脚本 替换代码如下 for f in do open a Visual Studio Code f done command s保存会出现一个弹框 保存为 用VSCode打开
  • IDEA2021.2创建java web项目(很详细,手把手创建)

    该文章适合人群 初学java web 不用maven或者gradle创建java web项目 忘记了怎么创建web项目 错误示范 上来直接创建java ee 项目 这样创建出来的项目有Maven或者Gradle包管理 正确演示 1 创建项目
  • “威胁”员工全来上班后,马斯克“尴尬”了:车没地停、工位不够坐、Wi-Fi 还太差

    点击蓝色 程序员黄小斜 关注我哟 加个 星标 每天和你一起多进步一点点 整理 郑丽媛 出品 程序人生 ID coder life 每一个特斯拉员工每周都要在办公室工作 40 个小时 如果你不来 那么我们就认为你辞职了 在马斯克 蛮横 地放出
  • python机器学习——NLTK及分析文本数据(自然语言处理基础)

    NLTK NLTK Natural Language Toolkit 自然语言处理工具包 在NLP 自然语言处理 领域中 最常使用的一个Python库 自带语料库 词性分类库 自带分类 分词功能 NLTK安装 安装 pip install
  • OpenCart 常见错误解决

    1 GC 报错 错误内容 opencart SessionHandler gc ps files cleanup dir opendir var lib php5 failed Permission denied 解决方法 更改 php i
  • 【论文记录】Boosting Detection in Crowd Analysis via Underutilized Output Features

    Boosting Detection in Crowd Analysis via Underutilized Output Features Abstract Crowd Hat使用一种混合的2D 1D压缩技术进行细化空间特征与获取特定人群
  • k8s删除pod镜像没响应marking for deletion pod TaintManagerEviction

    使用命令强制删除 Pod的状态为 Marking for deletion 表示该Pod正在被标记为待删除状态 但实际上并没有被删除 这可能是因为以下原因之一 删除操作被阻塞 可能是由于某些资源或容器正在使用该Pod 导致删除操作被阻塞 您
  • Python报错:module 'scipy' has no attribute 'xxx'

    首先看使用的函数在不在这几个当中 以 interpolate 为例 scipy 将 interpolate 单独定义为一个小子库 所以调用的时候不能单独写 import scipy 而是要写成 import scipy interpolat
  • 路由器打印机服务器系统,路由器怎么设置打印机服务器

    路由器怎么设置打印机服务器 内容精选 换一换 CDC Change Data Capture 即数据变更抓取 通过为源端数据源开启CDC ROMA Connect可实现数据源的实时数据同步以及数据表的物理删除同步 ROMA Connect支
  • DS排序--希尔排序

    目录 题目描述 思路分析 AC代码 题目描述 给出一个数据序列 使用希尔排序算法进行降序排序 间隔gap使用序列长度循环除2直到1 输入 第一行输入t 表示有t个测试示例 第二行输入n 表示第一个示例有n个数据 n gt 1 第三行输入n个
  • PowerBUS 双总线收发器

    随着智能化的发展 人的需求变高 在一个环境内 如果子设备较多 距离适中 大多数是布置485总线加电源地需要4根线 这样就会导致走线复杂 线的成本也较高 如果用BLE或者wifi无线连接时也需要电源地2根线 成本更高 而powerbus双总线
  • Android基础学习总结(十六)——基于ijkplayer封装支持简单界面UI定制的视频播放器

    前言 项目开发中遇到需要解析播放m3u8视频流的情况 但是原生的PlayerView非常慢 使用起来复杂 不适合上手 这里找到一款ijkplayer是Bilibili基于ffmpeg开发并开源的轻量级视频播放器 支持播放本地网络视频 也支持
  • [Spring学习]04 Spring IOC创建Bean的几种方式

    目录 一 调用构造器创建Bean对象 二 调用静态工厂方法创建Bean对象 三 调用实例 动态 工厂方法创建Bean对象 一 调用构造器创建Bean对象 通过调用构造器创建Bean对象是我们在实际开发中最常用的方式 而构造器创建Bean对象