IOC容器——Bean

news2024/12/23 6:17:07

IOC容器——Bean

    • Bean配置
    • name别名属性
    • Bean作用范围scope
    • Bean的实例化
      • 构造方法示例化
      • 静态工厂实例化
      • 实例工厂与FactoryBean
        • 实例工厂
        • FactoryBean
    • bean的生命周期

Bean配置

bean图

name别名属性

Bean ID 唯一,而关于Spring别名,我们可以在配置文件中使用name来定义,解决命名时产生的分歧在这里插入图片描述

注意哦“class”属性不能写接口如BookDao的类全名,因为接口是没办法创建对象的。

  • NoSuchBeanDefinitionException:
    这个异常可能是我们经常遇到的异常,需要特别注意哦,主要是因为无法获取到IOC中的Bean(不管是通过name还是id无法获取时都会抛出这个异常)

🍊个🌰:
很明显没有service2这个别名
示例别名

诺就会爆下面这个错误咯:
诺出现错误咯

Bean作用范围scope

先看一个图
默认单例
很明显我们可以看出Spring为我们创建对象时是单例的,即只创建一个相同的对象,即scope=“singleton” 如果我们把属性切换为scope=“prototype”,便不再是单例。
scope
结果

那么为什么Spring管理的对象默认是单例的嘞,其实很容易想,如果不是单例的话,那就会创建无穷多个咯,bean对象只有一个就避免了对象的频繁创建与销毁,达到了bean对象的复用,提高性能,所以IOC也更适合管理可复用的一些对象。比如:表现层对象 业务层对象 数据层对象 工具对象(更适合交给IOC管理);相反封装实例的域对象(实体类),因为会引发线程安全问题,所以不适合。

  • 关于单例Bean的一些线程安全问题
    如果对象是有状态对象,即该对象有成员变量可以用来存储数据的,因为所有请求线程共用一个bean对象,所以会存在线程安全问题。如果对象是无状态对象,即该对象没有成员变量没有进行数据存储的,因方法中的局部变量在方法调用完成后会被销毁,所以不会存在线程安全问题。

因为是单例的所以我们创建的类对象都是同一个类,如果我们根据这个bean创建了多个不同的类并且需要修改时,修改一个其他都会改变

Bean的实例化

通过前面的学习我们大概已经知道了,IOC如何管理对象,那么IOC中的对象又是如何进行创建的捏?

首先关于如何示例话bean,我们有三种方式:构造方法、静态工厂、实例工厂

构造方法示例化

首先我们做好一些准备
1、配置好Spring环境后,准备一个BookDao接口和BookDaoImpl类

public interface BookDao {
    public void save();
}

public class BookDaoImpl implements BookDao {
    public void save() {
        System.out.println("book dao save ...");
    }
}

book类准备

2、既然我们说了是使用构造方法进行实例化那么何以见得捏
我们给它加一个构造方法观察它是否执行构造方法就好啦

public class BookDaoImpl implements BookDao {
    
    public BookDaoImpl() {
        System.out.println("book dao constructor is running ....");
    }

    public void save() {
        System.out.println("book dao save ...");
    }

}

构造方法

甚至我们可以尝试把public修饰换成private,我们发现同样可以(暴力反射我们日后再提),如果我们再在构造方法加入参数我们会发现无法运行,经过尝试我们便可知道Spring创建Bean使用的是无参构造方法

静态工厂实例化

我们创建一个静态工厂并配置一下xml文件。
在这里插入图片描述

同时我们对他编写启动类进行启动测试
静态工厂启动累

当然我们工厂类创造时一定要注意那个具体的实例方法即factory-method

实例工厂与FactoryBean

实例工厂

我们发现实例工厂与静态工厂及其相似不同点的话就是静态工厂中的方法是静态方法。

所以我们在修改配置文件时也要注意实例工厂造Bean时首先要把实例工厂这个Bean造出来
实例工厂配置方法
模型图

所以我们会发现userFactory被创建出来就是为了创造底下的bean,我们有什么办法再进行一下优化吗?——FactoryBean

FactoryBean

还是上面的实例工厂但是我们在创建实例工厂的时候,让这个Bean实现FactoryBean这个接口,同时他的范型为我们需要造的对象。

当然我们需要实现他的方法,默认会实现两个如下图所示
实现方法

public class UserDaoFactoryBean implements FactoryBean<UserDao> {
    //代替原始实例工厂中创建对象的方法
    public UserDao getObject() throws Exception {
        return new UserDaoImpl();
    }

    public Class<?> getObjectType() {
        return UserDao.class;//要注意这里的类型
    }

}

当然配置文件也要改咯
factory
当然此时我们的创建对像依旧默认是单例的,如果我们在实例工厂时,多实现一个方法便可使其非单例,(当然配置文件也可当如果同时使用scope,则以下面这个方法为主)如下图所示:

是否单例

bean的生命周期

通过添加init-method=“” 与destroy-method=""属性来控制初始化与关闭
值得注意的是Spring的IOC容器是运行在JVM中运行main方法后,JVM启动,Spring加载配置文件生成IOC容器,从容器获取bean对象,然后调方法执行main方法执行完后,JVM退出,这个时候IOC容器中的bean还没有来得及销毁就已经结束了所以没有调用对应的destroy方法,那如果我们需要关闭容器呢?因为ApplicationContext中没有close方法需要将ApplicationContext更换成ClassPathXmlApplicationContext便可在最后添加close执行关闭程序的方法内容。

当然close是暴力关闭,我们还可以注册关闭钩子

ctx.registerShutdownHook() :任何地方都可以在运行完后关闭钩子。

(意思就是close关闭属于暴力关闭后无法执行后面内容)

其实以上内容我们相对用的都较少,所以我们并没有加图片示意或者标注

我们更推荐service实现相应的接口与方法
实现接口与方法

当然顾名思义afterPropertiesSet方法会在类属性设置执行之后再执行

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

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

相关文章

Google Play管理中心和ASO的重要性

Android Vitals 是我们应用优化的重要组成部分&#xff0c;能够显示应用的运行状况。一般来说&#xff0c;如果应用具有良好的体验&#xff0c;它会更容易在Google Play中被用户发现&#xff0c;从而获得更好的排名和更多的安装量。 从开发者的角度来看&#xff0c;Android Vi…

JAVA8新特性stream流收集为Map,value为null导致空指针的问题

jdk8 新特性stream深受喜爱&#xff0c;平时使用比较多&#xff0c;其中有&#xff1a; Map<String, String> collect2 list.stream().collect(Collectors.toMap(Book::getName, Book::getIdNO,(pre, after) -> pre)); 现象如下&#xff1a; package MainTest.str…

HTML5 <nav> 标签、HTML5 <noscript> 标签

HTML5 <nav> 标签 实例 HTML5 <nav>标签用于表示HTML页面中的导航&#xff0c;可以是页与页之间导航&#xff0c;也可以是页内的段与段之间导航。 一个导航链接实例&#xff1a; <nav> <a href"/html/">HTML</a> | <a href&qu…

关于pinduoduo开放接口测试

什么是接口测试 接口测试是测试系统组件间接口的一种方式&#xff0c;接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是检查数据的增删改查操作&#xff0c;以及系统之间的逻辑关系等。 接口测试作为集成测试的一部分&#xff0c;通过直接…

归并排序(非递归实现) 计数排序

上一期我们说了归并排序的递归是如何实现的&#xff0c;但是递归如果层次太多的话容易栈溢出&#xff0c;所以我们还需要掌握非递归的实现&#xff0c;但是我们非递归需要如何实现&#xff1f; 下面我们就来看一下非递归的实现 归并排序的非递归实现他并不需要栈队列这些东西…

No.042<软考>《(高项)备考大全》【第26章】法律法规(合同法、招投标法、政府采购法、著作权法)

【第26章】法律法规&#xff08;合同法、招投标法、政府采购法、著作权法&#xff09;1 考试相关2 合同法练习题参考答案3 招投标法3.1 法规时间总结3.2 招投标流程3.3 招标3.4 投标3.5 评标3.6 练习题参考答案3.7 论文写作3.8 投标文件的编写应该注意哪些事项4 著作权法4.1 练…

找漏洞赚外快?给ChatGPT挑毛病,最高奖励14万

反正闲着也是闲着&#xff0c;不如来给ChatGPT找漏洞&#xff1f;毕竟&#xff0c;万一真的找到漏洞了还能赚一笔外快。 当地时间 4 月 11 日&#xff0c;OpenAI 宣布推出漏洞赏金计划。该公司将根据报告问题的严重性和影响提供现金奖励&#xff0c;奖励范围从 200 美元到 200…

Spring经典扩展接口应用:BeanPostProcessor

备注&#xff1a;新进行基本思路总结&#xff0c;四五月总结完 一、BeanPostProcessor基本知识总结 BeanPostProcessor是Bean级处理器&#xff0c;用于在bean实例化后、初始化后自定义修改bean实例&#xff0c;如属性校验、针对自定义bean做统一处理等。 BeanPostProcessor接…

实战:向人工智能看齐用Docker部署一个ChatGPT

文章目录前言鉴赏chatgpt环境要求开始搭建云安装docker从docker仓库拉取chatgpt-web镜像创建容器并运行chatgpt-web创建容器启动chatgpt-web访问自己的chatgpt总结前言 目前GPT-4都官宣步入多模态大型语言模型领域了&#xff0c;大佬竟然还没有体验GPT么。作为一个资深搬砖人士…

容器编排部署

一、概述 容器编排部署的作用&#xff1a; 实现复杂容器应用架构之间的互联&#xff0c;减少大量容器部署的成本 Docker"三剑客"编排部署 工具︰ docker machine 用于创建和管理docker host docker compose 通过一个文件定义复杂的容器应用之间的关系 容器与容…

【FMCW系统性能参数之测量精度公式推导】

本文编辑&#xff1a;调皮哥的小助理 连续多篇文章都在说FMCW雷达系统性能参数这个事儿&#xff0c;如&#xff1a; &#xff08;1&#xff09;从奈奎斯特采样定理推导FMCW雷达系统性能参数 &#xff08;2&#xff09;从FMCW毫米波雷达系统的性能参数理解4D成像毫米波雷达的设…

深度学习语义分割篇——FCN原理详解篇

&#x1f34a;作者简介&#xff1a;秃头小苏&#xff0c;致力于用最通俗的语言描述问题 &#x1f34a;往期回顾&#xff1a;目标检测系列——开山之作RCNN原理详解    目标检测系列——Fast R-CNN原理详解    目标检测系列——Faster R-CNN原理详解 &#x1f34a;近期目标&…

Unity --- 3d数学 --- 坐标系统

1.世界坐标系是固定不动的 2.每一个游戏物体在世界坐标系中都有对应的坐标和方向 1.轴心点的位置不是固定的&#xff0c;是可以人为设定的 1.Screen Space --- 屏幕坐标 2.我们看到的屏幕其实就是相机所在的平面的位置 --- 而屏幕坐标系的Z其实就是游戏中的物体到相机平面的…

GDOUCTF

WEB hate eat snake 这是一个JS的题目&#xff0c;但是这个题目好像有点奇怪&#xff0c;不是很理解&#xff0c;当时我找到了我寝室JS的大哥&#xff0c;跟大哥说了一下我的思路&#xff0c;就是他根据这个time然后/1000转化为秒&#xff0c;就当作是我们玩游戏的一个分数&a…

速卖通韩国下载量再次登顶,7500万投资换来回报

韩国市场&#xff0c;还是一片蓝海。 速卖通终于等到了回报。 近日&#xff0c;数据平台 Data ai 显示&#xff0c;3 月 9 日以来&#xff0c;速卖通再次成为韩国购物 App 下载量第一名&#xff0c;超过当地电商平台 Coupang。 这或许和速卖通近日在韩国的布局有关。 前些天…

使用File System Access API 让浏览器可以操作文件

使用File System Access API 让浏览器可以操作文件 在早期我们开始学习前端三件套时&#xff0c;经常会听到这样的说法&#xff1a;浏览器是一个沙盒&#xff0c;它不允许我们操作本地文件&#xff0c;但是现在这个说法已经不再适用了&#xff0c;因为我们可以使用 File Syste…

2023接口自动化测试,完整入门篇

1. 什么是接口测试 顾名思义&#xff0c;接口测试是对系统或组件之间的接口进行测试&#xff0c;主要是校验数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及相互逻辑依赖关系。其中接口协议分为HTTP,WebService,Dubbo,Thrift,Socket等类型&#xff0c;测试类型又主…

BBR算法

BBR算法 简述 bbr算法为google在2016年提出&#xff0c;用于改善tcp的性能&#xff0c;提升稳定性&#xff0c;降低延迟&#xff0c;更好地应对网络损伤。在整个算法调节周期中&#xff0c;bbr算法都在尽力维持最大bw和最小rtt。 对比传统的tcp算法 传统算法不能区分是拥塞导…

【RabbitMQ】Java操作RabbitMQ之入门Demo

目录 一、项目创建 二、生产者 三、消费者 一、项目创建 我们先在idea里创建两个Maven项目一个项目作为生产者&#xff0c;另一个作为消费者。创建完成后&#xff0c;在各自的pom.xml文件里引入Java使用RabbitMQ的依赖 <dependency><groupId>com.rabbitmq</g…

Android 单位和尺寸 以及ViewPager的使用

一 px 和 pt 1 px pixels 像素点 2 pt point 一个标准的长度单位&#xff0c;1pt 1/72英寸&#xff0c;用于印刷业&#xff0c;非常简单易用。 二 dp 和 sp 1 dp 就是 dip device independent pixels(设备独立像素) 不同设备有不同的显示效果。这个和设备硬件有关系&…