Spring的IOC容器实例化bean的三种方式

IOC容器实例化bean的三种方式:构造方法、静态工厂、实例工厂。
本文章涉及工程目录如下:

在这里插入图片描述

IOC容器实例化bean的三种方式

构造方法

对象在new的时候通过构造方法完成实例化。bean本质是对象,也可以通过构造方法完成实例化。

涉及代码片

// applicationContext.xml
<bean id="flowService" class="com.lwb.services.impl.FlowServiceImpl">
// FlowServiceImpl.java
public class FlowServiceImpl implements FlowService {
    private FlowServiceImpl(){
        System.out.println(this.getClass() + "-----进入FlowServiceImpl" +
                "无参构造器");
    }
    @Override
    public void saveService() {
        System.out.println(this.getClass() + "-----进入FlowServiceImpl");
    }
}
// App.java
public class App {
    public static void main(String[] args){
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
    }
}
执行后返回结果:

在这里插入图片描述
思考:
1、构造方法底层是通过反射机制实现的。注意上面无参构造方法是private,只有反射才能访问到私有方法。
2、底层使用的是无参构造方法。可以写一个带参的构造方法进行验证,会报错。

静态工厂

涉及代码片

// applicationContext.xml
<!--静态工厂实例化方法
        class为静态工厂类路径,factory-method 为方法名
    -->
    <bean id="flowDao1" class="com.lwb.factory.FlowDaoStaticFactory" factory-method="getFlowDao"/>
// FlowDaoStaticFactory.java
//注意getFlowDao是static的,所以叫静态工厂
public class FlowDaoStaticFactory {
     public static FlowDao getFlowDao(){
        System.out.println("-----进入静态工厂方法StaticFactory");
        return new FlowDaoImpl();
    }
}
// App.java
public class App {
    public static void main(String[] args){
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
    }
}
执行后返回结果:

在这里插入图片描述

思考:
1、为什么使用静态工厂方法,而不直接去new?
	静态工厂方法在返回new的对象实例之前,可以实现一些业务逻辑,如代码中的日志输出。

实例工厂

涉及代码片

// applicationContext.xml
	<bean id="flowDaoExFactory" class="com.lwb.factory.FlowDaoExFactory"/>
    <bean id="flowDao2" factory-method="getFlowDao" factory-bean="flowDaoExFactory"/>
// FlowDaoExFactory .java
//注意getFlowDao是public的,对比静态工厂
public class FlowDaoExFactory {
    public FlowDao getFlowDao(){
        System.out.println(this.getClass() + "------进入实例工厂类FlowDaoExFactory");
        return new FlowDaoImpl();
    }
}
// App.java
public class App {
    public static void main(String[] args){
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
    }
}
执行后返回结果:

在这里插入图片描述
思考:
1、静态工厂和实例工厂的区别?
静态工厂方法是static的,是在类加载的时候就创建了,可以直接使用,不需要实例化工厂类。实例工厂是public的,需要先实例化,才能使用。静态工厂适合实时性很高的场景。实际场景中大部分使用实例工厂。
2、实例工厂的简单写法——FactoryBean
涉及代码片

// applicationContext.xml
	<bean id="flowDao3" class="com.lwb.factory.FlowDaoFactoryBean"/>
// FlowDaoFactoryBean .java
public class FlowDaoFactoryBean implements FactoryBean<FlowDao> {
    //返回实例化对象
    @Override
    public FlowDao getObject() throws Exception{
        System.out.println(this.getClass() + "------进入实例工厂FlowDaoFactoryBean,getObject");
        return new FlowDaoImpl();
    }
    //返回class对象
    @Override
    public Class<?> getObjectType() {
        System.out.println(this.getClass() + "------进入实例工厂FlowDaoFactoryBean,getObjectType");
        return FlowDao.class;
    }
}
// App.java
public class App {
    public static void main(String[] args){
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
    }
}

在这里插入图片描述
思考:
1、为什么只输出了getObject()里面的内容?getObject()重写了返回实例化对象的方法。getObjectType()返回的是class对象,只有在调用的时候才会执行(反射?)
2、FlowDaoFactoryBean可以通过重写isSingleton()方法声明是否是单例。

思考

1、上述例子中App.java为什么不获取bean(执行FlowDao flowDao = (FlowDao) ctx.getBean("flowDao3")),也能实例化?
IOC实例化bean对象的时机:
(1)IOC初始化的bean对象默认是单例的。单例+懒加载会在ioc容器初始化完成后直接实例化所有bean对象供使用。
(2)非单例和单例+非懒加载。在使用bean的时候才会去初始化。
菜鸟numberone
关注 关注
  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring | IOC技术之Bean的配置与实例化
BoBooY的Java学习笔记
12-01 3969
本文深入讲解了SpringIOC技术对Bean的配置以及实例化三种方式:构造方法实例化、静态工厂实例化以及实例工厂实例化
Spring IOC容器Bean 管理 第2关:Bean 的实例化方式
于建章的博客
11-07 1191
Spring IOC容器Bean 管理 第2关:Bean 的实例化方式
Spring IOC容器bean实例化
喜爱兰兰
03-28 1749
传统程序采用new方法和反射机制来实例化对象,在IOC容器采用.xmlbean的配置数据配合反射机制来实例化bean。Spring IOC实例化Bean的方法三种: 使用构造器实例化bean使用静态工厂实例化bean使用实例工厂实例化bean 下面是三种方法的代码实现:(我的bean类包名为com.yangwan.beans,配置文件为application-config.xml)
Spring IoC容器实例化bean的三种方式
北慕的博客
05-30 4979
先来看一下工程目录结构 下面是接口及其实现类和实体类 package com.luhy.spring.hello; public interface HelloApi { public void sayHello(); } package com.luhy.spring.hello; public class HelloImpl implements HelloApi {
SpringBean实例化三种方式
qq_42137703的博客
09-15 1810
SpringBean实例化三种方式 Bean的实例化方式三种,分别为:默认无参的构造器实例化、静态工厂方法实例化实例工厂方法实例化 创建一个User对象,什么都没有,只用来做测试 public class User { } 1. 默认无参的构造器实例化 编写配置文件bean.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/sche
Spring容器实例化bean的四种方式
扛麻袋的少年的博客
03-23 1022
  Spring IOC容器如何实例化Bean呢?传统应用程序可以通过new和反射方式进行实例化Bean。而Spring IOC容器则需要根据 Bean 定义里的配置元数据,使用反射机制来创建Bean。在Spring IOC容器根据Bean定义创建Bean主要有以下几种方式: 1.使用构造器实例化Bean   这是最简单的方式Spring IOC容器既能使用1.默认空构造器也能使用2.有参数构造器两种方式创建Bean,如以下方式指定要创建Bean类型: 1.1 使用空构造器   使用空构造器进行定义,
Spring IOC容器实例化Bean整体流程图
weixin_64939936的博客
09-26 1383
修改Bean的定义:通过实现BeanFactoryPostProcessor接口,可以在Spring容器实例化Bean之前修改Bean的定义信息,例如修改Bean的属性值、修改Bean的作用域、添加自定义的初始化方法等。实现AOP相关的功能:BeanPostProcessor接口可以用于实现AOP相关的功能,例如将Bean的代理对象替换为原始的Bean对象,或者在Bean的方法执行前后进行拦截和增强。执行时机:在BeanDefinitionMap填充完毕,Bean实例化之前执行。
SpringIOC容器 Bean初始化和销毁回调
热门推荐
terrybg
05-16 1万+
前言 Spring Bean 的生命周期:init(初始化回调)、destory(销毁回调),在Spring提供了四种方式来设置bean生命周期的回调: 1.@Bean指定初始化和销毁方法 2.实现接口 3.使用JSR250 4.后置处理器接口 使用场景: 在Bean初始化之后主动触发事件。如配置类的参数。 1.@Bean指定初始化和销毁方法 public class Phone { private String name; private int money; //get
Spring源码IOC实例化Bean的方式
闲来也无事
09-13 4771
2.4 doCreateBean 概览 经过了前面的一系列准备,接下来进入IOC的核心方法doCreateBean。间涉及较多的知识点,分多个小节分析,下面先来了解一下doCreateBean的主要逻辑。 protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException { // Instantiate the bea
Spring IoC 依赖注入的三种方式
swadian2008的博客
10-19 1354
Spring IoC(Inversion of Control,控制反转)是一种设计原则,也是一种编程思想。IoC 的核心思想是将对象创建对象之间的依赖关系的管理交由容器来负责,而不是由程序员手动管理。Spring IoC 才接触会比较难懂,但实际上很简单,总结起来就一句话:让别人为你服务!下边一张图展示了 IoC 容器对象与依赖对象之间扮演的角色:那么问题来了,如何让IoC容器为你服务呢?IoC容器又是如何把你所需要的对象提供给你的呢?
浅谈springioc实例化bean的三个方法
08-29
Spring IOC实例化Bean有三种方法:构造器实例化、静态工厂方法实例化实例工厂方法实例化。每种方法都有其优缺,选择哪种方法取决于实际需求。 在实际开发,我们可以根据需要选择合适的实例化方法。例如,如果...
springIoC容器装配Bean详解
08-28
在这些配置Spring 容器将读取 Bean 的配置信息,形成 Bean 定义注册表,然后实例化 Bean,将其放入 Bean 缓,供应用程序使用。 二、Bean 基本配置 Bean 的基本配置包括 Bean 的命名、依赖注入和自动...
详解Spring IOC 容器启动流程分析
08-25
refresh 方法实现了 IOC 容器的启动逻辑,包括准备容器、加载 BeanDefinition、实例化单例 Bean、注册事件监听器等步骤。 首先,refresh 方法会首先准备容器,包括准备 BeanFactory、加载 BeanDefinition 等步骤。...
Spring实现一个简单的SpringIOC容器
08-30
SpringIOC(Inversion of Control,控制反转)容器是其核心特性之一,它负责管理和装配应用程序对象。本文将深入探讨如何实现一个简单的Spring IOC容器,以及涉及的主要知识点。 首先,控制反转是一种设计...
springboot项目打包后在终端运行显示没有主清单属性
最新发布
weixin_52236586的博客
10-20 111
注释pom文件的这个。
springsecurity使用
ghx123456ghx的博客
10-17 308
首先进入免登录的首页,当点击链接进入受到保护页面时,此时因没有登录,页面自动跳到登录页面,在登录页面输入有USER角色的账号时,自动跳到请求的href="/user/index"后台。2 springsecurity配置。3 登录跳转被保护页面流程。
JavaWeb合集05-SpringBoot基础知识
qq_57340195的博客
10-17 932
Autowrite :自动装配,通过声明的数据类型来装配对应的bean对象。缺点,只能获取到一个相同类型的bean对象,如果有IOC容器里面有2个Bean对象使用@Autowrite依赖注入就好报错。由于三层架构,每一层都需要下次成来提供对应的方法,所有要new 下一次的对象,如果上一层的类名发送改变,那么上一层就需要修改对应的类名,如下。3、@Resource注解:通过它来代替@Autowrite注解,直接指定要注入的Bean对象,参数name的值就是要注入的Bean对象
Springboot整合knife4j生成文档
Think_and_work的博客
10-16 393
null
车辆管理的SpringBoot技术革新
2401_85760095的博客
10-18 1041
目前,界面设计已经成为对软件质量进行评价的一条关键指标,一个好的用户界面可以使用使用系统的信心和兴趣增加,从而使工作效率提高,JSP技术是将JAVA语言作为脚本语言的,JSP网页给整个服务器端的JAVA库单元提供了一个接口用来服务HTTP的应用程序。B/S架构给使用管理系统的用户带来极大的便利。6、网络上的客户端和服务器可以用来编程任何独立的编程环境,也有国,GB2312,BIG5,日文写作,一般基金,用于支持多国语言,并且可以嵌入在数据表和其他软件shift_jis访问柱可以用作的名称。
springIOC容器实例化bean的过程
05-19
Spring IOC容器实例化bean的过程大致如下: 1. 配置文件读取:Spring容器会读取指定的配置文件,如XML文件或Java类。 2. 实例化BeanDefinition对象Spring容器会根据配置文件的定义,创建BeanDefinition对象。 ...
写文章

热门文章

  • 安装anaconda完成后大量文件缺失,包括script文件的解决方案之一 2293
  • c++经典问题——最大间隙问题的求解 1712
  • Spring的IOC容器实例化bean的三种方式 724
  • SpringFrame框架无法添加Sring Config如何解决 496
  • 非社区版idea搭建Maven+springmvc工程 482

分类专栏

  • 剑指offer 19篇
  • 算法 20篇

最新评论

  • Spring的IOC容器实例化bean的三种方式

    CSDN-Ada助手: 不知道 Java 技能树是否可以帮到你:https://edu.csdn.net/skill/java?utm_source=AI_act_java

大家在看

  • Linux-shell实例练习
  • 点跟踪论文—RAFT: Recurrent All-Pairs Field Transforms for Optical Flow-递归的全对场光流变换 661
  • 谷歌:过程奖励校验LLM推理步骤
  • react 高阶函数-函数的柯里化实现
  • python+大数据+基于大数据的电影天堂数据可视化系统【内含源码+文档+部署教程】 277

最新文章

  • 非社区版idea搭建Maven+springmvc工程
  • 错误: 找不到或无法加载主类 XXX.XXX.XXX
  • IOC容器创建的bean的生命周期
2024年5篇
2020年22篇
2018年1篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家玻璃钢仿真雕塑厂商青海天桥玻璃钢花盆报价玻璃钢抽象雕塑制作厂家湛江玻璃钢仿铜地动仪雕塑西藏仿铜玻璃钢雕塑深圳玻璃钢景观雕塑价格宿迁玻璃钢海豚雕塑山东玻璃钢果蔬雕塑玻璃钢灭火器雕塑设计绥化玻璃钢商场美陈周口公园玻璃钢仿铜雕塑公司福建走廊商场美陈供应玻璃钢雕塑浮雕山东创意玻璃钢雕塑定制龙岩玻璃钢雕塑厂家苏州春节商场美陈大型玻璃钢花盆设计山东玻璃钢小猪佩奇雕塑四会玻璃钢机器人雕塑价格山东玻璃钢雕塑家郑州步行街玻璃钢雕塑曹晖 玻璃钢 雕塑家长治玻璃钢海豚雕塑厂家广东特色商场美陈厂家供应小品玻璃钢人物雕塑酒店玻璃钢雕塑设计生肖玻璃钢雕塑电话佛山玻璃钢雕塑制造江阴玻璃钢雕塑节庆商场美陈制造香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化