Spring之Bean的实例化

news2025/7/8 21:41:15

文章目录

  • 前言
  • 一、通过构造方法实例化
  • 二、通过简单工厂模式实例化
  • 三、通过factory-bean实例化
  • 四、通过FactoryBean接口实例化


前言

Spring为Bean提供了多种实例化方法,通常包括四种方式。目的是:更加灵活

  • 第一种:通过构造方法实例化
  • 第二种:通过简单工厂模式实例化
  • 第三种:通过factory-bean实例化
  • 第四种:通过FactoryBean接口实例化

一、通过构造方法实例化

准备一个类:
SpringBean类:
默认有无参构造方法

public class SpringBean {
}

准备spring配置文件:
spring-bean.xml
Spring提供的第一种实例化方式:在spring配置文件中直接配置类全路径,spring会自动调用该类的无参数构造方法来实例化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">

    <bean id="sb" class="com.powernode.spring6.bean.SpringBean"></bean>
</beans>

准备测试类:

    @Test
    public void testSpringBean(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-bean.xml");
        SpringBean sb = applicationContext.getBean("sb", SpringBean.class);
        System.out.println(sb);
    }

运行结果如下:
对象创建成功

在这里插入图片描述

二、通过简单工厂模式实例化

编写Bean对象:

/**
 * 明星类(Bean)
 */
public class Star {
    public Star() {
        System.out.println("star的无参数构造方法执行");
    }
}

编写工厂类:

/**
 * 工厂类(明星工厂类)
 * 简单工厂模式中的工厂类角色 星工厂
 */
public class StarFactory {
    //工厂类中有一个静态方法
    //简单工厂模式又叫做静态工厂模式
    public static Star get(){
        //这个star对象最终实际上创建的时候还是程序员负责new的对象
        return new Star();
    }
}

编写spring配置文件:
Spring提供的第二种实例化方式:通过简单工厂模式,需要在spring配置文件中告诉spring框架,调用哪个类的哪个方法获取bean。
factory-method属性指的是工厂类中的静态方法,也就是告诉Spring调用这个方法可以获取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">
    <!--Spring提供的第二种实例化方式:通过简单工厂模式,需要在spring配置文件中告诉spring框架,调用哪个类的哪个方法获取bean-->
    <!--factory-method 属性指的是工厂类中的静态方法,也就是告诉Spring调用这个方法可以获取Bean-->
    <bean id="starBean" class="com.powernode.spring6.bean.StarFactory" factory-method="get"></bean>
</beans>

编写测试类:

    @Test
    public void testSpringBean2(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-bean.xml");
        Star star = applicationContext.getBean("starBean", Star.class);
        System.out.println(star);
    }

运行结果:
在这里插入图片描述

三、通过factory-bean实例化

编写Bean对象:

/**
 * 工厂方法模式当中的具体产品角色
 */
public class Gun {
    public Gun() {
        System.out.println("GUN的无参数构造方法执行了!");
    }

    public GunFactory get() {
        return null;
    }
}

编写工厂类:
与简单工厂模式不同的是工厂方法模式中的具体工厂角色中的方法是实例方法,简单工厂模式中的工厂角色中的方法是静态方法

/**
 * 工厂方法模式当中的 具体工厂角色
 */
public class GunFactory {
    //工厂方法模式中的具体工厂角色中的方法是实例方法
    public Gun get(){
        //实际上new对象还是程序员自己new的
        return new Gun();
    }
}

编写spring配置文件:
Spring提供的第三种实例化方式:通过工厂方法模式。通过factory-bean属性+factory-method属性来共同完成

<?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">
   <!--Spring提供的第三种实例化方式:通过工厂方法模式。通过factory-bean属性+factory-method属性来共同完成-->
    <!--告诉spring框架,调用哪个对象的哪个方法来获取bean-->
    <bean id="gunFactoryBean" class="com.powernode.spring6.bean.GunFactory" ></bean>
    <!--以下配置非常关键,factory-bean属性告诉spring调用哪个对象。factory-method属性告诉spring调用对象的哪个方法-->
    <bean id="gunBean" factory-method="get" factory-bean="gunFactoryBean"></bean>

</beans>

编写测试程序:

    @Test
    public void testSpringBean3(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-bean.xml");
        Gun gun = applicationContext.getBean("gunBean", Gun.class);
        System.out.println(gun);
    }

运行结果:
在这里插入图片描述

四、通过FactoryBean接口实例化

这种方式是通过第三种方式衍变来的。
在spring中,当编写的类直接实现FactoryBean接口之后,factory-bean不需要指定了,factory-method也不需要指定了。factory-bean会自动指向FactoryBean接口的类,factory-method会自动指向getObject()方法。

创建一个bean对象:

public class Person {
    public Person() {
        System.out.println("person的无参数构造方法执行了!!");
    }
}

创建工厂 实现FactoryBean:

也是一个bean 只不过这个bean比较特殊 叫做工厂bean
通过工厂bean这个特殊的bean可以获取普通的bean

public class PersonFactory implements FactoryBean<Person>{
    //这个方法在接口中有默认实现
    //默认返回 true 表示单例
    //如果想多例 直接将这个方法修改为return false即可
    @Override
    public boolean isSingleton() {
        return true;
    }


    @Override
    public Person getObject() throws Exception {
        //最终这个bean的创建还是程序员自己new的
        return new Person();
    }

    @Override
    public Class<?> getObjectType() {
        return null;
    }
}

编写spring配置文件:

通过FactoryBean这个工厂bean主要是想对普通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">
    <!--Spring提供的第四种实例化方式:通过FactoryBean接口来实现-->
    <!--这种方式就是第三种方式的简化,由于编写的类实现了FactoryBean接口,所以这个类是特殊的类,不需要再手动指定factory-bean、factory-method-->
    <bean id="person" class="com.powernode.spring6.bean.PersonFactory"></bean>
</beans>

编写测试类:

    @Test
    public void testSpringBean4(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-bean.xml");
        Person person = applicationContext.getBean("person", Person.class);
        System.out.println(person);
    }

运行结果:
在这里插入图片描述


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

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

相关文章

计算机网络——第五章网络层笔记(4)

距离矢量路由选择协议&#xff08;DV算法&#xff09; 每个路由器维护一张表&#xff0c;表中列出了当前已知的到每个目标的最佳距离&#xff0c;以及为了到达那个目标&#xff0c;应该从哪个接口转发。 DV算法是动态的和分布式的&#xff0c;它常被用于小型网络&#xff0c;…

开发时长一年半golang工程师应该具备什么样的技术能力?

一、为什么会有人选择golang? 其实无非是被动和主动。 **被动&#xff1a;**面试新公司后&#xff0c;被领导调岗现学golang&#xff0c;因为公司需要。 **主动&#xff1a;**觉得这个方向有前景&#xff0c;大厂有需求&#xff0c;学了可以升职加薪&#xff01; 所以不管…

visual studio连接远程开发

一、问题提出 vscode在连接远程调试时不知道如何调试cmake&#xff0c;研究了半天没研究出来&#xff0c;因此决定使用visual studio进行调试。 二、安装 Linux端 cmake版本最低为3.11&#xff0c;可以从此网站下载&#xff1a;https://cmake.org/files/v3.11/ 之前安装的visu…

怎么样恢复移动硬盘格式化的数据呢?

怎么样恢复移动硬盘格式化的数据呢&#xff1f; 这是一个让人很困扰的问题&#xff0c;其实格式化后的数据可以使用牛学长数据恢复工具一键恢复数据&#xff0c;它可以快速识别指定存储介质中所有丢失的文件&#xff0c;操作简单且恢复成功率高。 其工作原理只会提取原有数据&…

安装mayavi

mayavi是一款可视化工具&#xff0c;知乎说直接pip install mayavi不好使&#xff0c;所以我就直接没试&#xff0c;我直接试的好使的。 下面的链接是一个各种依赖包的地址&#xff0c;点开进去之后找mayavi https://link.zhihu.com/?targethttps%3A//www.lfd.uci.edu/~gohlke…

详解Unity中的新版Nav Mesh|导航寻路系统 (一)

前言 之前我们讲解过Unity的Nav Mesh系统&#xff0c;其中提到过这个新版的Nav Mesh&#xff0c;它解决现有Nav Mesh的几个缺陷&#xff0c;比如无法动态烘焙&#xff0c;无法按照Agent的半径和高度适当的判断可行路径。现在新版Nav Mesh可以彻底解决这个问题&#xff01;某种…

Android Studio 插件开发2、网络请求、创建dialog、trello获取cardId等

网络请求 点击这里就出来一个弹框 更新Actions 关注这个 <actions><action id"TrelloAction"class"com.anguomob.anguo.actions.trello.TrelloAction"text"TrelloAction"description"Move a trello card from to do to the next …

大神带你玩转异步编程,理论与实践齐飞,敢说是目前最全的讲解了

要完全理解异步编程需要先理解几个概念 任务 我给任务的定义是完成某项功能的单元模块&#xff0c;任务有大有小&#xff0c;站在操作系统的角度&#xff0c;一个程序就是一个任务&#xff0c;每当运行一个程序就会创建一个新的任务&#xff0c;它在操作系统中还有一个无人不…

软件需求分析——需求工程过程

如果有兴趣了解更多相关内容&#xff0c;可以来我的个人网站看看&#xff1a;瞳孔空间 一&#xff1a;相关概念 需求工程过程的目的&#xff1a;介绍为软件加强型系统中的复杂软件设计的需求工程过程&#xff0c;涉及 抽取需求分析需求验证需求管理需求 主要关注点&#xf…

Isaac-gym(7):物理模拟(actor生成、创建、控制等)

1. 创建actor 1.1 actor的创建与句柄 actor是GymAsset的实例。函数create_actor将一个参与者添加到环境中&#xff0c;并返回一个参与者句柄&#xff0c;该句柄可用于以后与该参与者交互。出于性能原因&#xff0c;最好在actor创建期间保存句柄&#xff0c;而不是在模拟运行时…

[同向双指针] 209. 长度最小的子数组 713. 乘积小于 K 的子数组 3. 无重复字符的最长子串

同向双指针 该文结合灵神讲解进行编码&#xff1a;https://www.bilibili.com/video/BV1hd4y1r7Gq 该类滑动窗口一般符合某种单调性。 当不满足条件时左指针后移&#xff0c;当满足条件时右指针后移。 假设数组长度为 n&#xff0c;左指针最多移动 n 次&#xff0c;右指针最…

【无人机】基于RRT算法实现四旋翼无人机的安全和最小能量轨迹规划附matlab代码和报告

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

Linux安装RabbitMQ步骤分享

1、Erlnag安装 1.1、 安装Erlang版本要求 Erlang安装需要对应各自的版本 RabbitMQ Erlang Version Requirements — RabbitMQ 1.2、 Erlang安装 1、目录准备 cd /usr/local/src/ mkdir rabbitmq cd rabbitmq2、添加仓库地址 为了减少安装的错误 我们使用仓库安装 ,类似于m…

【算法篇-数论】快速幂

快速幂1. 利用快速幂优化的时间复杂度2. 快速幂方法及代码3.总结文章参考自 B站董晓算法 1. 利用快速幂优化的时间复杂度 所谓的快速幂就是快速计算底数的n次幂暴力求幂的话时间复杂度为O&#xff08;n&#xff09; 利用快速幂可以做到 时间复杂度为 O(log2n) 2. 快速幂方法…

操作系统4小时速成:I/O管理,spooling脱机技术,设备分配,分配数据结构,IO调度,IO子系统,IO控制方式,IO分类

操作系统4小时速成&#xff1a;I/O管理&#xff0c;spooling脱机技术&#xff0c;设备分配&#xff0c;分配数据结构&#xff0c;IO调度&#xff0c;IO子系统&#xff0c;IO控制方式&#xff0c;IO分类 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xf…

一、什么是 MQ

MQ的概念 MQ &#xff08;Message Queue&#xff09;消息队列&#xff0c;是在消息传输过程中存储消息的容器。多用于分布式系统之间的通信。 队列是基础数据结构中 “先进先出” 的一种数据结构。 消息对列&#xff0c;指把要传输的数据消息放在队列中&#xff0c;用队列机制…

SpringBoot:速成总结+实战——员工管理系统

这篇文章先是总结SpringBoot&#xff0c;当然我很多源码都没有仔细的去抠&#xff0c;而且这样一个成熟的框架想都不用想就知道源码很复杂&#xff0c;先学框架怎么用。接着就用SpringBoot完成一个较为简单的项目&#xff1a;员工管理系统。 目录端口号被占用怎么办什么是Sprin…

Hadoop总结——Hadoop基础

一、Hadoop是什么 Hadoop是一个由Apache基金会所开发的分布式系统基础架构 主要解决&#xff0c;海量数据的存储和海量数据的分析计算问题 广义上来说&#xff0c;Hadoop通常是指一个更广泛的概念——Hadoop生态圈 二、Hadoop发展历史 1&#xff09;Lucene--Doug Cutting开…

python中深拷贝和浅拷贝的区别

文章目录值的引用浅拷贝可变数据类型与不可变数据类型不可变数据类型可变数据类型深拷贝深拷贝浅拷贝总结若将需要注释若干行&#xff0c;则将这些行选中&#xff0c;然后按住 ctrl / 键就可以了&#xff0c;再按一次&#xff0c;即可取消多行注释若要批量缩进&#xff0c;那么…

磷脂酰丝氨酸 猪脑(phosphatidylserine,PS)试剂级;丝氨酸磷脂

磷脂酰丝氨酸&#xff08;phosphatidylserine&#xff0c;PS&#xff09;又称丝氨酸磷脂&#xff0c;二酰甘油酰磷酸丝氨酸&#xff0c;简称PS&#xff0c;是一类普遍存在的磷脂&#xff0c;通常位于细胞膜的内层&#xff0c;磷酯化合物中的磷酸甘油酯类&#xff0c;是细胞膜组…