Bean 的实例化(创建 | 获取)

news2024/11/15 1:36:26
  • Spring为Bean提供了多种实例化方式,包括如下4种方式:
    • 第一种:通过构造方法实例化
    • 第二种:通过简单工厂模式实例化
    • 第三种:通过factory-bean实例化(工厂方法模式实例化)
    • 第四种:通过FactoryBean接口实例化
  • Spring中为Bean对象的创建准备了多种方案,目的是为了能够更加灵活

通过构造方法实例化

  • 我们之前一直使用的就是这种方式。
  • 在spring配置文件中直接配置类全路径,即在Spring配置文件中配置bean,Spring会自动调用该类的无参数构造方法来实例化Bean

public class SpringBean {}

<?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">

	<bean id="springBean" class="cw.spring.study.bean.SpringBean"/>
	
</beans>

通过简单工厂模式实例化

抽象产品类

public abstract class Fruit {}

具体产品类

public class Apple extends Fruit{}

工厂类
public class FruitFactory {
    // 创建水果对象的方法
    public static Fruit getFruit() {
        // 最终的Apple类对象是通过调用该工厂类的该方法new的对象
        return new Apple();
    }
}
配置文件配置工厂类生产 bean
  • 在Spring配置文件中告诉Spring框架,调用哪个类的哪个方法获取 Bean
<!--
  factory-method属性
    指定的是工厂类当中的静态方法,也就是告诉Spring框架,调用这个方法可以获取Bean
  	创建出来的为产品对象,不为工厂对象,工厂类中的方法为静态方法,通过类名直接调用创建对象
  	通过class属性指定的类调用该类的静态工厂方法,进行对象的创建,
	最终创建的对象为产品对象,id为apple
-->
<bean id="apple" class="cw.spring.study.bean.FruitFactory" factory-method="getFruit"/>
测试
@org.junit.Test
public void test1() {
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
    System.out.println(applicationContext.getBean("apple", Fruit.class));
}

通过factory-bean实例化(工厂方法模式实例化)

抽象产品类
/**
 * ClassName: Fruit
 * Package: cw.spring.study.bean
 * Description:
 */
public abstract class Fruit {}
具体产品类
/**
* ClassName: Apple
* Package: cw.spring.study.bean
* Description:
*/
public class Apple extends Fruit{}
抽象工厂类
/**
 * ClassName: FruitFactory
 * Package: cw.spring.study.bean
 * Description:
 */
public abstract class FruitFactory {
    
    /**
     * 水果工厂生产水果的方法
     * 
     * @return 水果
     */
    public abstract Fruit getFruit();
    
}
具体工厂类
/**
 * ClassName: AppleFactory
 * Package: cw.spring.study.bean
 * Description:
 *
 * @Author tcw
 * @Create 2023-05-25 18:37
 * @Version 1.0
 */
public class AppleFactory extends FruitFactory{

    // 实例方法
    @Override
    public Fruit getFruit() {
        // 生产苹果
        return new Apple();
    }
}
配置文件配置工厂类生产 bean
  • 告诉Spring框架,调用哪个对象的哪个方法来获取Bean
<!-- 
  工厂方法模式,通过 factory-bean属性 + factory-method属性来共同完成 
  由于工厂类用于创建对象的方法为实例方法,所以需要先创建工厂对象,工厂对象也需要被spring管理
  AppleFactory 实际上是一个工厂bean,用于创建对象的bean
-->
<bean id="appleFactory" class="cw.spring.study.bean.AppleFactory"/>
<!--
  factory-bean属性
    告诉Spring调用哪个工厂对象,进行bean的创建
  factory-method属性
    告诉Spring调用工厂对象的哪个实例方法创建bean
  该配置用于指定用哪个工厂对象的哪个方法创建对象
-->
<bean id="apple" factory-bean="appleFactory" factory-method="getFruit"/>
测试
@org.junit.Test
public void test1() {
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
    System.out.println(applicationContext.getBean("apple", Fruit.class));
}

通过FactoryBean接口实例化

  • 以上的第三种方式中,factory-bean(生产bean的工厂bean)是我们自定义的,factory-method(生产bean的工厂方法)也是我们自己定义的。
  • 在Spring中,当我们编写的类直接实现FactoryBean接口之后,用于创建bean的factory-bean就不需要我们指定了,工厂bean的factory-method也不需要我们指定了。factory-bean会自动指向实现FactoryBean接口的类,factory-method会自动指向该类中的getObject()方法。
    • 因为我们在配置文件中指定的用于创建bean的类在实现FactoryBean接口之后,Spring就知道这是一个工厂类,并且知道工厂方法是哪个
  • 这种方式实际上就是第三种方式的简化
  • FactoryBean在Spring中是一个接口,被称为“工厂Bean”。
  • “工厂Bean”是一种特殊的Bean,所有的“工厂Bean”都是用来协助Spring框架来创建其他Bean对象的。
产品类
/**
 * ClassName: Person
 * Package: cw.spring.study.bean
 * Description:
 *
 * @Author tcw
 * @Create 2023-05-25 18:56
 * @Version 1.0
 */
public class Person {}
工厂类
import org.springframework.beans.factory.FactoryBean;

/**
 * ClassName: PersonFactoryBean
 * Package: cw.spring.study.bean
 * Description:
 *
 * @Author tcw
 * @Create 2023-05-25 18:57
 * @Version 1.0
 */
public class PersonFactoryBean implements FactoryBean<Person> {
    
    // 创建bean的工厂方法
    @Override
    public Person getObject() throws Exception {
        return new Person();
    }
    
    @Override
    public Class<?> getObjectType() {
        return null;
    }
}
public interface FactoryBean<T> {
    String OBJECT_TYPE_ATTRIBUTE = "factoryBeanObjectType";

    @Nullable
    T getObject() throws Exception;

    @Nullable
    Class<?> getObjectType();

    // 该方法接口进行了默认实现,工厂bean创建的对象是否为单例的
    // 默认情况下,创建的对象是单例的
    // 如果要让工厂bean创建的对象为多例,则重写该方法,返回false即可
    default boolean isSingleton() {
        return true;
    }
}
配置文件配置工厂类生产 bean
<!--
  这种方式实际上就是第三种方式的简化。
  由于你编写的类实现了FactoryBean接口,所以这个类是一个特殊的类,
  不需要你再手动指定:factory-bean、factory-method
  实现了FactoryBean接口,Spring知道这是一个工厂类,并且知道用于创建bean的工厂方法是哪个
  
  通过一个特殊的Bean:工厂Bean,来返回一个普通的Bean Person对象。
  通过FactoryBean这个工厂Bean主要是想对普通Bean进行加工处理。
-->
<bean id="person" class="cw.spring.study.bean.PersonFactoryBean"/>
测试
@org.junit.Test
public void test1() {
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
    System.out.println(applicationContext.getBean("person", Person.class));
}

工厂方法实例化小结

相比于通过构造方法进行bean的实例化,采用工厂方法进行bean的实例,我们可以在bean对象创建出来到将创建出来的对象交给Spring容器进行管理这一段时间内,我们可以对bean对象进行加工处理。

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

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

相关文章

智能未来:低代码与AI如何重塑企业应用开发

引言 在当今瞬息万变的商业环境中&#xff0c;企业面临着前所未有的挑战与机遇。数字化转型已经成为各行各业的必然趋势&#xff0c;而在这一过程中&#xff0c;应用开发的效率与智能化程度成为企业竞争力的重要衡量标准。传统的开发模式往往需要大量的时间和资源&#xff0c;而…

【Godot4.3】基于ShapePoints的Polygon2D扩展

概述 这同样是来自2023年7月份的一项实验性工作&#xff0c;基于最初版本的ShapePoints静态函数库&#xff0c;实现了对Polygon2D节点的扩展&#xff0c;用于创建参数化图形的Polygon2D节点。 Polygon2D节点本身只能通过顶点绘制工具&#xff0c;创建很随意的多边形。通过Sha…

MySQL数据库管理系统下载安装

一. MySQL概述&#xff1a; 1.数据库相关概念 数据库&#xff1a;存储数据的仓库&#xff0c;数据是有组织地进行存储&#xff08;DataBase 简DB&#xff09;数据库管理系统&#xff1a;操纵和管理数据库的大型软件 &#xff08;DataBase Management System 简DBMS)SQL:操…

一分钟创建自己的分班查询系统,家长扫码即可进群

开学后&#xff0c;老师们的忙碌也达到了顶峰。整理教材、准备课程计划、布置教室&#xff0c;这些工作已经让人应接不暇&#xff0c;更别提还要处理分班事宜。以往&#xff0c;老师们需要一个个通知家长分班结果&#xff0c;这不仅耗时耗力&#xff0c;还容易出错。家长们也常…

​数字IC设计基本概念之多时钟设计​

当设计中使用了多个时钟时&#xff0c;这些时钟域之间的关系可能是synchronous、asynchronous或者exclusive的。如下所示&#xff1a; Synchronous&#xff1a; Asynchronous&#xff1a; Exclusive&#xff1a; 需要人为地指定设计中时钟之间的关系&#xff0c;EDA工具才能正…

燃油车淘汰倒计时开始了?

文 | AUTO芯球 作者 | 璇子 新能源车要取代燃油车了&#xff1f; 油车车主先别喷啊 就在上个月 新能源乘用车月销量数据一经公布 我一看 渗透率居然达到了惊人的51% 啥概念啊 如果卖100台车 51台都是新能源 其他49台才是燃油车 看到这数据 有好多看热闹的人就在说 …

Vue组件:创建组件、注册组件、使用组件

1、创建组件 组件&#xff08;component&#xff09;是 Vue.js 最强大的功能之一。通过开发组件可以封装可服用的代码&#xff0c;将封装好的代码注册成标签&#xff0c;扩展 HTML 元素的功能。几乎任意类型应用的界面都可以抽象为一个组件树&#xff0c;而组件树可以用独立可…

【完-移动云-基础】移动云架构和ECS

一、移动云产品架构 产品架构分为IaaS、PaaS、SaaS 我司使用的是IaaS&#xff0c;仅托管了服务器资源。软件则由浪潮提供。 一图理解三者区别 二、云主机ECS 是一种弹性按需提供的云端服务器&#xff0c;可选择不同的配置 基础服务&#xff1a; 虚拟化、镜像、云硬盘、云…

autoware整体架构的分析

autoware framework sensinglidar driver&#xff08;lidar驱动&#xff09;PointCloud Preprocessing&#xff08;点云预处理&#xff09;Detection&#xff08;检测&#xff09;GNSS (全球导航卫星系统)IMU (惯性测量单元) Localization&#xff08;定位&#xff09;Pose Ini…

产品需求过程管理重要性

产品需求过程管理重要性 背景 以下都是真实事项经历回顾&#xff0c;在产品开发过程中&#xff0c;产品经理与研发团队之间的沟通至关重要。然而&#xff0c;沟通不畅或信息缺失常常导致需求无法准确传达&#xff0c;最终影响产品的成功。以下是一些常见的问题&#xff1a; 1.需…

Qt插件开发总结6--插件间依赖

文章目录 一、前言二、基本策略三、效果展示四、关键代码4.1、主程序4.2、插件管理器4.3、插件A 一、前言 插件大致可分为&#xff1a;功能性插件、界面插件&#xff1b;一个软件由一堆插件堆起来&#xff0c;必然难以避免插件间相互引用&#xff0c;例如&#xff1a;插件A调用…

安防监控/视频汇聚EasyCVR视频监控平台级联上级,无法播放是什么原因?

EasyCVR视频监控平台&#xff0c;作为一款智能视频监控综合管理平台&#xff0c;凭借其强大的视频融合汇聚能力和灵活的视频能力&#xff0c;在各行各业的应用中发挥着越来越重要的作用。EasyCVR视频汇聚平台采用先进的图像处理技术和传输协议&#xff0c;能够确保高清、稳定的…

Qt (13)【Qt窗口 —— 颜色对话框 QColorDialog】

阅读导航 引言一、颜色对话框 QColorDialog简介二、常用方法介绍⭕参数说明 三、使用示例 引言 在深入探讨了Qt的QMessageBox之后&#xff0c;我们现在转向QColorDialog&#xff0c;一个让用户轻松选择颜色的实用对话框&#xff0c;为Qt应用增添色彩选择的便捷性。 一、颜色对…

Java语言程序设计基础篇_编程练习题题目:17.16 (字符的頻率)

题目&#xff1a;17.16 (字符的頻率) 编写一个程序&#xff0c;提示用户输入一个 ASCII 文本文件名&#xff0c;然后显示文件中每个字符出现的频率。 代码示例 编程练习题17_16FrequencyOfCharacters.java package chapter_17;import java.io.DataInputStream; import java…

【HarmonyOS 4.0】网络请求 - axios

axios 相当于鸿蒙应用项目的一个第三方库&#xff0c;鸿蒙应用项目使用ohpm管理&#xff08;包括安装&#xff0c;卸载等&#xff09;第三方库。除了axios&#xff0c;还有很多其他的第三方库可供开发者使用&#xff0c;所有的第三方库都收录在OpenHarmony三方库中心仓。 1. 安…

以低代码技术加速推动企业数字创新

在数字化转型的浪潮中&#xff0c;企业面临着前所未有的挑战和机遇。随着技术的不断进步&#xff0c;企业需要快速适应市场变化&#xff0c;创新产品和服务&#xff0c;以保持竞争力。低代码技术作为一种新兴的开发模式&#xff0c;正逐渐成为企业数字创新的重要推动力。 低代码…

电比例流量泵放大器

电比例泵控制是一种精准的液压传动控制系统&#xff0c;利用输入的电信号按比例来调制液压参数&#xff0c;以实现对流量、压力和方向的连续且成比例的控制。这种控制在现代工业中的应用非常广泛&#xff0c;尤其在需要精确控制的场合。 按控制元件分类&#xff1a;电液比例控…

无人机培训机构必备运营合格证及驾驶员训练机构合格证详解

无人机培训机构在运营过程中&#xff0c;必须持有必要的运营合格证及驾驶员训练机构合格证&#xff0c;以确保其培训活动的合法性、规范性和安全性。以下是对这两种合格证的详细解析&#xff1a; 无人机培训机构运营合格证 无人机培训机构运营合格证是国家或地区民航管理部门…

【软考中级攻略站】-软件设计师(1)-数值及其转换和数据表示

进制转换 n进制->十进制 步骤说明&#xff1a; 识别基数&#xff1a;首先确认你正在处理的是n进制数&#xff0c;这里的n就是该数的基数。 数位权重&#xff1a;从右向左数&#xff0c;每个位置上的数字都有一个权重&#xff0c;最右边的位置权重为0&#xff0c;依次向左…

【JUC】10-Java内存模型JMM

1. JMM 通过JMM来实现和主内存之间的抽象关系。屏蔽各个硬件平台和操作系统的内存访问差异以实现让Java程序在各种平台下都能达到一致的内存访问效果。 三大特性&#xff1a;原子性&#xff1a;互斥&#xff0c;同时成功或失败。有序性&#xff1a;指令重排序后有序。可见性&a…