Spring | IOC技术之Bean的配置与实例化

news/2024/5/17 17:14:45/文章来源:https://blog.csdn.net/qq_58233406/article/details/128124913

在这里插入图片描述

👑 博主简介
   🥇 Java领域新星创作者
   🥇 阿里云开发者社区专家博主、星级博主、技术博主
🤝 交流社区:BoBooY(优质编程学习笔记社区)

文章目录

  • Bean的基础配置
    • 1、id 与 class属性
    • 2、name属性
    • 3、scope属性
  • Bean的实例化
    • 1、构造方法实例化
    • 2、静态工厂实例化
    • 3、实例工厂实例化
      • 🚩 FactoryBean的使用

Bean的基础配置

1、id 与 class属性

<bean id="" class=""/>
<!--举例-->
<bean id="bookDao" class="com.bby.dao.bookDaoImpl"/>
<bean id="bookDao" class="com.bby.dao.bookDaoImpl"></bean>
  • id: bean的id,使用容器可以通过id值获取对应的bean,在一个容器中id值唯一
  • class: bean的类型,即配置的bean的全路径类名

注意:

  • class属性不能写接口如BookDao的类全名(因为接口是没办法创建对象的

  • id必须唯一,如果因为命名习惯产生分歧解决办法是设置name属性,也就是给Bean取别名

2、name属性

定义bean的别名,可定义多个,使用**逗号(,) 分号(😉 空格()**分隔

<bean id="bookDao" name="dao bookDaoImpl" class="com.bby.dao.bookDaoImpl"/>
<bean id="bookDao" name="dao,bookDaoImpl" class="com.bby.dao.bookDaoImpl"/>
<bean id="bookDao" name="dao;bookDaoImpl" class="com.bby.dao.bookDaoImpl"/>
  • 测试
  1. 这里我设置了两个别名daobookDaoImpl

在这里插入图片描述

  1. 获取这个Bean并调用它的方法
/*** @author BoBooY*/
public class App {public static void main(String[] args) {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");BookDao dao = (BookDao)applicationContext.getBean("dao");BookDao bookDaoImpl = (BookDao)applicationContext.getBean("bookDaoImpl");dao.save();bookDaoImpl.save();}
}
  1. 查看控制台结果

可以看到通过这个两个别名都可以获取到这个Bean

在这里插入图片描述

注意:

  • bean依赖注入的 ref 属性指定bean,必须在容器中存在,ref的属性值,也可也是另一个bean的name属性值,不过还是建议使用其id来进行注入

  • 如果id不存在,在获取时会获取不到,然后就会报错:NoSuchBeanDefinitionException

3、scope属性

  • singleton:单例(默认)
  • prototype:非单例
<bean id="bookDao" class="com.bby.dao.bookDaoImpl" scope="prototype"/>

分别获取单例模式和多例模式下的bean

  • 单例模式如下(singleton):

在这里插入图片描述

  • 非单例模式如下(prototype):

在这里插入图片描述


思考:

  • 为什么bean默认为单例?
    • bean为单例的意思是在Spring的IOC容器中只会有该类的一个对象
    • bean对象只有一个就避免了对象的频繁创建与销毁,达到了bean对象的复用,性能高
  • bean在容器中是单例的,会不会产生线程安全问题?
    • 如果对象是有状态对象,即该对象有成员变量可以用来存储数据的,
    • 因为所有请求线程共用一个bean对象,所以会存在线程安全问题。
    • 如果对象是无状态对象,即该对象没有成员变量没有进行数据存储的,
    • 因方法中的局部变量在方法调用完成后会被销毁,所以不会存在线程安全问题。
  • 哪些bean对象适合交给容器进行管理?
    • 表现层对象
    • 业务层对象
    • 数据层对象
    • 工具对象
  • 哪些bean对象不适合交给容器进行管理?
    • 封装实例的域对象,因为会引发线程安全问题,所以不适合。

Bean的实例化

bean本质上就是对象,对象在new的时候会使用构造方法完成,那创建bean也是使用构造方法完成的。

1、构造方法实例化

这里先说结论:Spring底层通过反射访问的类的无参构造方法来实例化Bean

验证:

  1. bookDaoImpl添加一个无参构造方法,并打印一句话,方便观察结果。
/*** @author BoBooY*/
public class BookDaoImpl implements BookDao {public BookDaoImpl() {System.out.println("book dao constructor is running ....");}public void save() {System.out.println("book dao save ...");}
}

查看控制台结果:

在这里插入图片描述

从这里可以看出:Spring容器在创建对象的时候也走的是构造函数

  1. 将构造函数改成private测试
/*** @author BoBooY*/
public class BookDaoImpl implements BookDao {private BookDaoImpl() {System.out.println("book dao constructor is running ....");}public void save() {System.out.println("book dao save ...");}
}

查看控制台结果:

在这里插入图片描述

从这里可以看出:Spring内部走的依然是构造函数,能访问到类中的私有构造方法,显而易见Spring底层用的是反射

  1. 使用带参构造方法测试
/*** @author BoBooY*/
public class BookDaoImpl implements BookDao {private BookDaoImpl(int a) {System.out.println("book dao constructor is running ....");}public void save() {System.out.println("book dao save ...");}
}

查看控制台结果:

在这里插入图片描述

程序会报错,说明Spring底层使用的是类的无参构造方法。

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.bby.dao.BookDaoImpl]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.bby.dao.BookDaoImpl.()

译:<init>()指定是类的构造方法,即该类的无参构造方法

  • Caused by: 引发
  • BeanInstantiationException:翻译为bean实例化异常
  • No default constructor found:没有一个默认的构造函数被发现

2、静态工厂实例化

  1. 准备一个OrderDao和OrderDaoImpl类

    public interface OrderDao {public void save();
    }
    
    public class OrderDaoImpl implements OrderDao {public void save() {System.out.println("order dao save ...");}
    }
    
  2. 创建一个工厂类OrderDaoFactory并提供一个静态方法

    //工厂类
    public class OrderDaoFactory {public static OrderDao getOrderDao(){return new OrderDaoImpl();}
    }
    
  3. 在spring的配置文件applicationContext.xml中添加以下内容

    <bean id="orderDao" class="com.bby.factory.OrderDaoFactory" factory-method="getOrderDao"/>
    
    • class:工厂类的类全名
    • factory-mehod:具体工厂类中创建对象的方法名
  4. 获取Bean测试

    public class App {public static void main(String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");OrderDao orderDao = (OrderDao) ctx.getBean("orderDao");orderDao.save();}
    }
    

在这里插入图片描述

3、实例工厂实例化

  1. 创建一个工厂类OrderDaoFactory2并提供一个普通方法,注意此处和静态工厂的工厂类不一样的地方是方法不是静态方法

    //实例工厂
    public class OrderDaoFactory2 {public OrderDao getOrderDao(){return new OrderDaoImplava}
    }
    
  2. 在spring的配置文件中添加以下内容

    <bean id="orderDaoFactory2" class="com.bby.factory.OrderDaoFactory2"/>
    <bean id="orderDao" factory-method="getOrderDao" factory-bean="orderDaoFactory2"/>
    
    • factory-bean:工厂的实例对象

    • factory-method:工厂对象中的具体创建对象的方法名

  3. 获取Bean进行测试

    /*** @author BoBooY*/
    public class App {public static void main(String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");OrderDao orderDao = (OrderDao) ctx.getBean("orderDao2");orderDao.save();}
    }
    

在这里插入图片描述

实例化工厂运行的顺序是:

  • 创建实例化工厂对象,对应的是第一行配置

  • 调用对象中的方法来创建bean

🚩 FactoryBean的使用

实例工厂实例化的方式配置的过程还是比较复杂,所以Spring为了简化这种配置方式就提供了一种叫FactoryBean的方式来简化开发。

  1. 创建一个OrderDaoFactoryBean的类,实现FactoryBean接口,重写接口的方法

    /*** @author BoBooY*/
    public class OrderDaoFactoryBean implements FactoryBean<OrderDao> {//代替原始实例工厂中创建对象的方法public OrderDao getObject() throws Exception {return new OrderDaoImpl();}//返回所创建类的Class对象public Class<?> getObjectType() {return OrderDao.class;}
    }
    
  2. 在Spring的配置文件中进行配置

    <bean id="orderDao" class="com.bby.factory.OrderDaoFactoryBean"/>
    
  3. 获取Bean进行测试

在这里插入图片描述


查看源码会发现,FactoryBean接口其实会有三个方法,分别是:

T getObject() throws Exception;Class<?> getObjectType();default boolean isSingleton() {return true;
}
  • getObject():被重写后,在方法中进行对象的创建并返回
  • getObjectType():被重写后,主要返回的是被创建类的Class对象
  • isSingleton:没有被重写,因为它已经给了默认值,从方法名中可以看出其作用是设置对象是否为单例,默认true

尾言:创作不易,如果本文的内容对您有帮助,还望客官可以支持一下博主,👍(点赞)+✏️(评论)+⭐️(收藏)是我创作的巨大动力!

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Anaconda默认安装在C:\Users\xxx\.conda\envs中

目录 问题&#xff1a; 解决&#xff1a; 更改默认安装位置 移动已安装环境 问题&#xff1a; 解决&#xff1a; 更改默认安装位置 用记事本打开 C:\Users\zqk\.condarc 在最后插入 envs_dirs: - D://anzhuang//Anaconda3//envs 如若需更改pkgs&#xff0c;插入如下代…

OTA: Optimal Transport Assignment for Object Detection 原理与代码解读

paper&#xff1a;OTA: Optimal Transport Assignment for Object Detection code&#xff1a;https://github.com/Megvii-BaseDetection/OTA 背景 标签分配&#xff08;Label Assignment&#xff09;是目标检测中重要的一环&#xff0c;经典的标签分配策略采用预定义的规则…

Caffeine 源码、架构、原理(史上最全,10W字 超级长文)

文章很长&#xff0c;而且持续更新&#xff0c;建议收藏起来&#xff0c;慢慢读&#xff01;疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 &#xff1a; 免费赠送 :《尼恩Java面试宝典》 持续更新 史上最全 面试必备 2000页 面试必备 大厂必备 涨薪必备 免费赠送 经典…

【剧前爆米花--爪哇岛寻宝】面向对象的三大特性——封装、继承以及多态的详细剖析(中——多态)。

作者&#xff1a;困了电视剧 专栏&#xff1a;《JavaSE语法与底层详解》 文章分布&#xff1a;这是一篇关于Java面向对象三大特性——多态的文章&#xff0c;在本篇文章中我会分享多态的一些基础语法以及类在继承时代码的底层逻辑和执行顺序。 目录 多态的定义及实现条件 多态…

【程序人生】4年创作纪念日,不忘初心,继续前行

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;专注于研究 Java/ Liunx内核/ C及汇编/计算机底层原理/源码&#xff0c;就职于大型金融公司后端高级工程师&#xff0c;擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &#x1…

CleanMyMac X2022苹果电脑专业清理Mac加速器软件

CleanMyMac X2023最新免费版苹果电脑专业清理软件&#xff0c;对于Mac电脑用户来说&#xff0c;Cleanmymac X是一款再熟悉不过的电脑清理软件&#xff0c;它是由苹果认证并对外承认的一款第三方清理软件&#xff0c;几乎有95%的Mac用户都会安装并使用&#xff0c;Cleanmymac X究…

从一泡尿的工夫说起

大家好&#xff0c;我是校长。今天聊点不一样的&#xff0c;昨天读书的一点深刻感悟。大家有没有想过这么一个问题&#xff1a;如果没有记录时间的工具被发明&#xff0c;没有时钟&#xff0c;我们现在的生活会怎么样&#xff1f;在那个时钟尚未出现的日子里&#xff0c;如果确…

人工智能-机器学习-深度学习-概述

文章目录一&#xff1a;人工智能需要的基础和涉及内容二&#xff1a;数学基础&#xff08;1&#xff09;线性代数&#xff08;2&#xff09;概率论&#xff08;3&#xff09;数理统计&#xff08;4&#xff09;最优化方法&#xff08;5&#xff09;信息论三&#xff1a;机器学习…

虹科活动 | SWCF 2022卫星通信与仿真测试线上研讨会倒计时,快来报名吧!

您是否在因线下论坛的地点限制而错失技术干货分享&#xff1f;您是否因时间安排而无法亲临现场与行业专家交流&#xff1f;虹科举办全新线上论坛SWCF&#xff0c;与行业专家一起为您带来最新热点话题讨论与技术干货分享&#xff01; 什么是SWCF 虹科每年将开展卫星与无线通信…

计算机毕业设计之java+ssm网络硬硬盘系统网站

项目介绍 网盘&#xff0c;又称网络U盘、网络硬盘&#xff0c;是一些网络公司推出的在线存储服务。向用户提供文件的存储、访问、备份、共享等文件管理功能&#xff0c;使用起来十分方便。不花钱的移动硬盘。用户可以把网盘看成一个放在网络上的硬盘或U盘&#xff0c;不管你是…

量子计算(十):量子计算原理

文章目录 量子计算原理 一、酉变换 二、矩阵的指数函数 三、单位矩阵 四、单量子比特逻辑门 五、泡利矩阵 六、常见逻辑门 量子计算原理 经典计算中&#xff0c;最基本的单元是比特&#xff0c;而最基本的控制模式是逻辑门&#xff0c;可以通过逻辑门的组合来达到控制电…

如何做好风险管控,杜绝项目风险突然爆发?

软件开发最怕临近交付期&#xff0c;项目风险突然爆发。那么如何做好风险管理&#xff0c;提前排除隐患&#xff1f; 1、提前规划开发风险的科学管理与控制流程 项目需建立自己的组织级别风险资产库&#xff0c;并在开发过程中&#xff0c;不断地更新和完善。并对项目风险进行科…

Java搭建宝塔部署实战毕设项目springboot车险理赔管理系统源码

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 本期给大家带来一套Java开发的毕业设计项目springboot车险理赔管理系统源码。 技术架构 技术框架&#xff1a;SpringBoot mybatis bootstrap jquery mysql5.7运行环境&#xff1a;jdk8 nginx1.20 tomcat9 …

Spring IoC依赖注入-6

1. 依赖注入的模式和模型: Spring 提供了哪些依赖注入的模式和类型? 手动模式 - 配置或者编程的方式&#xff0c;提前安排注入规则 XML资源配置元信息Java 注解配置元信息API 配置元信息 自动模式 - 实现方提供依赖自动关联的方式&#xff0c;按照内建的注入规则 Autowiring …

VisDrone数据集之集群检测(一)

VisDrone坐标信息 VisDrone数据集格式: txt标签内容为&#xff1a;bbox_left&#xff0c;bbox_top&#xff0c;bbox_width&#xff0c;bbox_height&#xff0c;score,object_category&#xff0c;truncation&#xff0c;occlusion 类别&#xff1a; ignored regions(0), pede…

[附源码]计算机毕业设计springboot绿色生鲜

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

aws eks 日志和监控配置

资料 Kubernetes Logging powered by AWS for Fluent Bithttps://docs.amazonaws.cn/AmazonCloudWatch/latest/monitoring/Container-Insights-setup-logs-FluentBit.html如何在 Amazon EKS 中将容器日志流式传输到 CloudWatch&#xff1f;, eks日志 使用fluentbit发送日志到…

PX4代码解析(6)

一、前言 上一节介绍了PX4姿态估计调用函数的流程&#xff0c;这一节分享一下我对PX4姿态解算的解读.首先&#xff0c;要理解PX4姿态解算的程序&#xff0c;要先从传感器的特性入手&#xff0c;这里主要介绍的传感器有加速度计&#xff0c;磁力计&#xff0c;陀螺仪. 二、传感…

2022最新1w字MySQL索引面试题(附md文档)

小熊学Java个人网站&#xff1a;https://javaxiaobear.gitee.io/&#xff0c;每周持续更新干货&#xff0c;建议收藏&#xff01; 1、Mysql如何实现的索引机制&#xff1f; MySQL中索引分三类&#xff1a;B树索引、Hash索引、全文索引 2、InnoDB索引与MyISAM索引实现的区别是什…

11月30日:linux服务器安装以及部署项目

准备一个连接linux服务器的可视化工具&#xff0c;开始发车 推荐使用国产&#xff1a; finalshell 下载地址&#xff1a;FinalShell SSH工具,服务器管理,远程桌面加速软件,支持Windows,macOS,Linux,版本3.9.7,更新时间2022.10.26 - SSH工具 SSH客户端 xshell&#xff1a;安装…