Spring:IOC的详解☞Bean的实例化、Bean的生命周期

news2024/11/15 11:42:39

1、Bean基础配置

bean的基础配置:

<bean id="" class=""/>

Bean的别名:name属性

Bean的作用范围:scope配置

使用bean的scope属性可以控制bean的创建是否为单例:

  • singleton 默认为单例
  • prototype 为非单例

——单例模式下多次从容器中获取bean的地址是是一样的。

——多例模式下多次从容器中获取bean的地址是不一样的。也就是创建了多个不同的实例。

public class AppForScope {
    public static void main(String[] args) {
        ApplicationContext ctx = new 
            ClassPathXmlApplicationContext("applicationContext.xml");

        BookDao bookDao1 = (BookDao) ctx.getBean("bookDao");
        BookDao bookDao2 = (BookDao) ctx.getBean("bookDao");
        System.out.println(bookDao1);
        System.out.println(bookDao2);
    }
}
  • 为什么bean默认为单例?
    • bean为单例的意思是在Spring的IOC容器中只会有该类的一个对象
    • bean对象只有一个就避免了对象的频繁创建与销毁,达到了bean对象的复用,性能高
  • bean在容器中是单例的,会不会产生线程安全问题?
    • 如果对象是有状态对象,即该对象有成员变量可以用来存储数据的,
    • 因为所有请求线程共用一个bean对象,所以会存在线程安全问题。
    • 如果对象是无状态对象,即该对象没有成员变量没有进行数据存储的,
    • 因方法中的局部变量在方法调用完成后会被销毁,所以不会存在线程安全问题。
  • 哪些bean对象适合交给容器进行管理?
    • 表现层对象
    • 业务层对象
    • 数据层对象
    • 工具对象
  • 哪些bean对象不适合交给容器进行管理?
    • 封装实例的域对象,因为会引发线程安全问题,所以不适合。
<bean
    id="bean的唯一标识"
    class="bean的类别名"
    scope="bean的作用范围,有singleton、prototype"
    name="为bean的别名"
    >

2、Bean实例化

bean本质上就是对象,创建bean使用构造方法。

构造方法无论是共有还是私有 都会被sping容器获取::spring通过反射获取类

Bean实例化的三种方式:

  1. 使用类中的构造方法进行创建,如果添加参数就不能运行了
  2. 静态工厂(了解):在bean标签中添加属性=工厂类中创建类的方法
  3. 使用实例工场(了解):使用了两个Bean标签
  4. 实例工厂的加强(实用):使用FactoryBean实例化bean

(1)bean是如何创建的呢?

        构造方法

(2)Spring的IOC实例化对象的三种方式分别是:

  • 构造方法(常用)
  • 静态工厂(了解)
  • 实例工厂(了解)
    • FactoryBean(实用)

这些方式中,重点掌握构造方法和FactoryBean即可。

需要注意的一点是,构造方法在类中默认会提供,但是如果重写了构造方法,默认的就会消失,在使用的过程中需要注意,如果需要重写构造方法,最好把默认的构造方法也重写下。

3、Bean生命周期

关于bean的相关知识还有最后一个是bean的生命周期,对于生命周期,我们主要围绕着bean生命周期控制来阐述:

  • 首先理解下什么是生命周期?
    • 从创建到消亡的完整过程,例如人从出生到死亡的整个过程就是一个生命周期。
  • bean生命周期是什么?
    • bean对象从创建到销毁的整体过程。
  • bean生命周期控制是什么?
    • 在bean创建后到销毁前做一些事情。

现在我们面临的问题是如何在bean的创建之后和销毁之前把我们需要添加的内容添加进去。

设置生命周期:

添加生命周期的控制方法,具体的控制有两个阶段:

  • bean创建之后,想要添加内容,比如用来初始化需要用到资源
  • bean销毁之前,想要添加内容,比如用来释放用到的资源

步骤1:添加初始化和销毁方法

针对这两个阶段,我们在BooDaoImpl类中分别添加两个方法,==方法名任意==

public class BookDaoImpl implements BookDao {
    public void save() {
        System.out.println("book dao save ...");
    }
    //表示bean初始化对应的操作
    public void init(){
        System.out.println("init...");
    }
    //表示bean销毁前对应的操作
    public void destory(){
        System.out.println("destory...");
    }
}

步骤2:配置生命周期

在配置文件添加配置,如下:

<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl" init-method="init" destroy-method="destory"/>

步骤3:运行程序

运行AppForLifeCycle打印结果为:

从结果中可以看出,init方法执行了,但是destroy方法却未执行,这是为什么呢?

  • Spring的IOC容器是运行在JVM中
  • 运行main方法后,JVM启动,Spring加载配置文件生成IOC容器,从容器获取bean对象,然后调方法执行
  • main方法执行完后,JVM退出,这个时候IOC容器中的bean还没有来得及销毁就已经结束了
  • 所以没有调用对应的destroy方法

知道了出现问题的原因,具体该如何解决呢?

close关闭容器

  • ApplicationContext中没有close方法
  • 需要将ApplicationContext更换成ClassPathXmlApplicationContext
ClassPathXmlApplicationContext ctx = new 
    ClassPathXmlApplicationContext("applicationContext.xml");
  • 调用ctx的close()方法
ctx.close();
  • 运行程序,就能执行destroy方法的内容

注册钩子关闭容器

  • 在容器未关闭之前,提前设置好回调函数,让JVM在退出之前回调此函数来关闭容器
  • 调用ctx的registerShutdownHook()方法
ctx.registerShutdownHook();

注意:registerShutdownHook在ApplicationContext中也没有

  • 相同点:这两种都能用来关闭容器
  • 不同点:close()是在调用的时候关闭,registerShutdownHook()是在JVM退出前调用关闭。

实现接口来完成生命周期设置

Spring提供了两个接口来完成生命周期的控制,好处是可以不用再进行配置init-method和destroy-method

接下来在BookServiceImpl完成这两个接口的使用:

修改BookServiceImpl类,添加两个接口InitializingBean, DisposableBean并实现接口中的两个方法afterPropertiesSet和destroy

public class BookServiceImpl implements BookService, InitializingBean, DisposableBean {
    private BookDao bookDao;
    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }
    public void save() {
        System.out.println("book service save ...");
        bookDao.save(); 
    }
    public void destroy() throws Exception {
        System.out.println("service destroy");
    }
    public void afterPropertiesSet() throws Exception {
        System.out.println("service init");
    }
}

bean生命周期小结

(1)关于Spring中对bean生命周期控制提供了两种方式:

  • 在配置文件中的bean标签中添加

init-method和destroy-method属性

  • 类实现

InitializingBean与DisposableBean接口,这种方式了解下即可。

(2)对于bean的生命周期控制在bean的整个生命周期中所处的位置如下:

  • 初始化容器
    • 1.创建对象(内存分配)
    • 2.执行构造方法
    • 3.执行属性注入(set操作)
    • 4.执行bean初始化方法
  • 使用bean
    • 1.执行业务操作
  • 关闭/销毁容器
    • 1.执行bean销毁方法

(3)关闭容器的两种方式:

  • ConfigurableApplicationContext是ApplicationContext的子类
    • close()方法
    • registerShutdownHook()方法

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

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

相关文章

HiveSQL:提取json串内容——get_json_oject和json_tuple

提取json串中内容&#xff0c;json格式示例如下 方法&#xff08;运行环境Hive&#xff09; get_json_objectjson_tuple get_json_object select json_data,get_json_object(json_data,$.price) as price -- 取第一层,get_json_object(json_data,$.inquiry_params) as in…

Hive3:常用的内置函数

1、查看函数列表 -- 查看所有可用函数 show functions; -- 查看count函数使用方式 describe function extended count;2、数学函数 -- round 取整&#xff0c;设置小数精度 select round(3.1415926); -- 取整(四舍五入) select round(3.1415926, 4); -- 设置小数精度4位(四…

wordpress资源下载博客站微信小程序源码v1.0

小程序说明&#xff1a; 本套源码基于hbuilder制作&#xff0c;支持QQ小程序&#xff0c;微信小程序等各大平台小程序版本&#xff0c;小程序需要配合后端wordpres系统管理发布&#xff0c;带有广告功能&#xff0c;非常适合运营。 功能说明&#xff1a; 1.全新pods rest a…

IDEA中如何配置Gradel加速与相关依赖找不到如何解决?

如何配置依赖加速 参考文章: https://www.cnblogs.com/yongdaimi/p/17892882.html 配置步骤 新版本的IDEA中进行插件开发需要单独下载开发插件 具体配置一下镜像加速 安装好上面的插件,进行下面这些配置。 在上面本地安装路劲在进行镜像加速的配置 新建一个init.gra…

数学建模——评价决策类算法(熵权法、模糊综合评价)

一、熵权法&#xff08;求解权重&#xff09; 概念原理 代码 import numpy as np # 导入numpy库&#xff0c;并简称为np# 定义一个自定义的对数函数mylog&#xff0c;用于处理输入数组中的零元素 def mylog(p):n len(p) # 获取输入向量p的长度lnp np.zeros(n) # 创建一个…

C语言典型例题42

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 习题3.2 有3个整数a&#xff0c;b&#xff0c;c&#xff0c;由键盘输入&#xff0c;输出其中最大的数&#xff0c;请编程序。 代码&#xff1a; //《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 //习…

URP 2022.3 custom render pass

这里需要注意&#xff0c;有两个部分要做&#xff0c;一步是写脚本和shader&#xff0c;一步是在editor里进行绑定 这里有个概念上需要注意的&#xff0c;他这个pass啊&#xff0c;实际依赖问题都需要你自己在execute处理的&#xff0c;比如你要画N次东西&#xff0c;就要在exe…

管易云·奇门与MySQL对接集成历史发货单查询连通执行操作-v1(管易历史发货单)

管易云奇门与MySQL对接集成历史发货单查询连通执行操作-v1(管易历史发货单) 接通系统&#xff1a;管易云奇门 管易云是金蝶旗下专注提供电商企业管理软件服务的子品牌&#xff0c;先后开发了C-ERP、EC-OMS、EC-WMS、E店管家、BBC、B2B、B2C商城网站建设等产品和服务&#xff0c…

算法力扣刷题记录 八十三【96.不同的二叉搜索树】

前言 动态规划第9篇。记录 八十三【96.不同的二叉搜索树】。 一、题目阅读 给你一个整数 n &#xff0c;求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种&#xff1f;返回满足题意的二叉搜索树的种数。 示例 1&#xff1a; 输入&#xff1a;n 3 输…

开箱即用的企业级CICD工具-云效流水线 Flow

开箱即用的企业级CICD工具-云效流水线 Flow 开箱即用的企业级CICD工具-云效流水线 Flow资源领取实操来啦编排流水线新建主机组运行流水线运行结果 关于 云效流水线 Flow 的一些看法操作感受新人建议满意与建议流水线Flow 优势 开箱即用的企业级CICD工具-云效流水线 Flow 看到这…

短视频SDK解决方案,降低行业开发门槛

美摄科技匠心打造了一款集前沿技术与极致体验于一体的短视频SDK解决方案&#xff0c;它不仅重新定义了短视频创作的边界&#xff0c;更以行业标杆级的短视频特效&#xff0c;让每一帧画面都闪耀不凡光芒。 【技术赋能&#xff0c;创意无限】 美摄科技的短视频SDK&#xff0c;…

OceanBase V4.3 列存引擎之场景问题汇总

在OceanBase 4.3版本发布后&#xff08;OceanBase社区版 V4.3 免费下载&#xff09;&#xff0c;其新增的列存引擎&#xff0c;及行列混存一体化的能力&#xff0c;可以支持秒级实时分析&#xff0c;引发了用户、开发者及业界人士的广泛讨论。本文选取了这些讨论中较为典型的一…

Linux系统top命令参数说明

目录 一、top命令概览 二、参数说明 一、top命令概览 二、参数说明 第一行&#xff1a;系统的整体情况概览 top:表示这是个top命令 10:53:55:表示当前系统时间 up 17 days, 19:10:表示系统运行时间 1user:表示当前登录用户人数 load average:表示1分钟/5分钟/15分钟 系统负载…

LangChain 实战案例:老喻干货店的 TextToSql 应用解析

前言 当我们在做项目开发时&#xff0c;数据库设计是项目早期的核心工作之一。我们要考虑业务需要用到的表、关联、索引&#xff0c;并预想出未来核心需求或易产生瓶颈的SQL。当这些事情做完&#xff0c;就可以喝杯咖啡&#xff0c;到前台摸鱼会儿了… 如果你是刚入门数据库学…

出海笔记精华问答 | 第四期

更新出海问答第四期&#xff0c;希望可以继续帮助大家解决问题哈。 Q1:当stripe把资金全退给客户但是货又发了&#xff0c;这是什么情况&#xff1f; A1: 这种情况一般是stripe不跟你合作了或者发生了争议。 Q2:如何知道stripe回复你的邮件是人工回复还是机器人回复&#xff…

Matlab自学笔记三十三:表table类型数据的创建、索引和自身属性的用法

1.表类型的概念 表&#xff08;table&#xff09;具有容器特性的数据类型&#xff0c;可以方便的存储混合类型的数据&#xff0c;可以使用数字或命名索引访问数据以及元数据&#xff08;例如变量名称&#xff0c;行名称&#xff0c;描述和变量单位等&#xff09;&#xff1b; …

Java版自动化测试之Selenium

1. 准备 编程语言&#xff1a;Java JDK版本&#xff1a;17 Maven版本&#xff1a;3.6.1 2. 开始 声明&#xff1a;本次只测试Java的Selenium自动化功能 本次示例过程&#xff1a;打开谷歌游览器&#xff0c;进入目标网址&#xff0c;找到网页的输入框元素&#xff0c;输入指…

基于Java+SpringBoot+Vue的网上租赁系统设计与实现

基于JavaSpringBootVue的网上租赁系统设计与实现 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1…

2024硅谷微软和OPENAI的CTO对人工智能发展的最新预测

2024硅谷微软和OPENAI的CTO对人工智能发展的最新预测 微软首席技术官凯文斯科特 在红杉资本&#xff08;Sequoia Capital&#xff09;发布的《Training Data》播客中&#xff0c;微软首席技术官凯文斯科特&#xff08;Kevin Scott&#xff09;坚定地重申了他对大语言模型&…

从文字到多媒体:GPT如何彻底革新内容创作

近年来&#xff0c;OpenAI开发的GPT&#xff08;生成预训练变换器&#xff09;模型在自然语言处理领域引起了广泛关注&#xff0c;尤其是GPT-3的推出&#xff0c;更是掀起了一场技术革新浪潮。然而&#xff0c;GPT模型不仅限于自然语言处理&#xff0c;其多模态应用前景同样令人…