bean生命周期

news2024/11/16 21:30:21

1.Aware和InitializingBean接口

  • Aware 接口用于注入一些与容器相关信息,例如

    • BeanNameAware: 注入bean的名字
    • BeanFactorAware: 注入beanFactor容器
    • ApplicationContextAware: 注入applicationContext容器
    • EmbeddedValueResolverAware: ${}
  • 代码演示

    public class MyBean implements BeanNameAware, ApplicationContextAware, InitializingBean {
    
        @Override
        public void setBeanName(String name) {
            System.out.println("当前bean" + this + "名字叫" + name);
        }
    
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            System.out.println("当前bean" + this + "容器是" + applicationContext);
        }
    
        @Override
        public void afterPropertiesSet() throws Exception {
            System.out.println("当前bean" + this + "初始化");
        }
    
        @Autowired
        public void aaa(ApplicationContext applicationContext) {
            System.out.println("当前bean" + this + "使用@Autowired容器是" + applicationContext);
        }
    
        @PostConstruct
        public void bbb() {
            System.out.println("当前bean" + this + "使用@PostConstruct初始化");
        }
    }
    
  • 这些功能能用@Autowired实现,为什么要使用Aware接口呢?

    • @Autowired的解析需要用到bean后处理器,属于扩展功能
    • Aware接口属于内置功能,不加任务扩展,spring就能识别到

    image-20221229214514573

2.@Autowired失效分析

@Configuration
public class MyBean2 {

    @Autowired
    public void aaa(ApplicationContext applicationContext){
        System.out.println("注入ApplicationContext");
    }

    @PostConstruct
    public void bbb(){
        System.out.println("初始化PostConstruct");
    }

    @Bean
    public BeanFactoryPostProcessor processor1(){
        return beanFactory -> {
            System.out.println("执行 processor1");
        };
    }
}

image-20221229220503365

  • 发现@Autowired失效了 这是为什么呢?

    image-20221229220533223

  • 而MyBean2的流程

    image-20221229220609611

3.spring初始化和销毁手段

  • postConstruct 执行顺序也是这样
  • 实现initializingBean接口
  • @Bean(initMethod = “init3”)

image-20221230124352232

image-20221230124621016

4.Scope

1.scope的类型有哪些?

  • singleton:容器中获取到的都是同一个bean
  • prototype:每次去容器中获取到的bean都不一样
  • request:与request域生命周期一样,请求来了会将bean创建出来放入request域中
  • session:同一个会话,会话开始创建,会话结束销毁
  • application:应用程序启动时bean创建,应用程序结束时bean被销毁

2.scope失效解决

  • 单例打印3次发现F1都是同一个bean?这是为什么呢?
@Component
public class E {

    @Autowired
  	@Lazy
    private F1 f1;
    // 2种方式
    @Autowired
    private ApplicationContext context;

    public F1 getF1() {
        return context.getBean(F1.class);
    }

    public F1 getF1() {
        return f1;
    }
}
@Component
@Scope("prototype")
public class F1 {
}

@ComponentScan("com.liubo.spring.a08")
public class A08Application {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(A08Application.class);
        E e = context.getBean(E.class);
        System.out.println(e.getF1());
        System.out.println(e.getF1());
        System.out.println(e.getF1());

        context.close();
    }
}

image-20221230204901755

  • 原因与解决方法

    image-20221230204911609

image-20221230205056937

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

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

相关文章

爬虫进阶一(基础一)

文章目录简介cookie爬取雪球热帖代理模拟登陆防盗链异步爬虫协程asyncioM3U8HLS爬取seleniumbilibili无头浏览器规避检测MySQLMongoDBRedis简介 这个系列分四部分 基础进阶Scrapy 框架逆向分析实战运用 先补充一些爬虫需要的基础知识和技能预热,爬取个简历模板网站…

浅谈Git

Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理,也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。 版本控制 什么是版本控制? 版本控制是一种在开发的过程中用于管理我们对文…

如何评价唐卫国公李靖的战功、军事才能、政治才能?

link 一鞭直渡清河洛Research and no development已关注470 人赞同了该回答个人以为,在军事上,李靖是当之无愧的唐朝第一名将,他用兵如神,精于谋略,无论是在实际的军事指挥上,还是军事理论上,他…

Vue3 中computed计算属性的使用

目录前言:什么是计算属性选项式中的计算属性组合式中的计算属性计算属性和方法的区别:计算属性/计算方法注意事项:总结前言: 目标:现在vue3的使用越来越普遍了,vue3这方面的学习我们要赶上,今天…

银行家算法 源码+实验报告(用了自取)

XIAN TECHNOLOGICAL UNIVERSITY 课程设计报告 实验课程名称 操作系统—银行家算法 专 业:计算机科学与技术 班 级: 姓 名: 学 号: 实验学时: …

小程序03/ uni-app自定义全局组件 、 uni-app项目引入 Uview-ui 框架教程方法 和 Uview框架介绍

一. uni-app自定义全局组件 1.创建组件 注意: 在components文件夹下创建组件 、文件夹名要与文件名保持一致 2.使用组件 注意: 在pages文件夹下任意vue文件、 template标签内使用该组件即可 二.uni-app项目引入Uview-ui框架教程方法 和 Uview框架介绍 (1) Uview介绍: Uvi…

【自学Java】Java运算符

Java运算符 Java运算符 Java 程序是由许多语句组成的,而语句的基本操作单位是表达式与运算符。运算符就是数学中的运算符号,如 、-、*、 / 等等。 Java 中提供了许多的运算符,这些运算除了可以处理一般的数学运算外,还可以处理…

Android---AndroidX

目录 Android 支持库 Android Support Library AndroidX 如何迁移老项目到 AndroidX? 支持库的作用 Android 支持库 Android 支持库是每个Android 应用程序中必不可少的一部分,你会发现它们无处不在。支持库为开发人员提供了将 Android 的最新和最强大功能添加…

《最重要的事,只有一件》笔记——目标不是做得更多,而是让自己需要的事情更少

目录 一、引言 二、书中摘要 1、只做一件事、一次只做一件事 2、专心于一件事不那么容易 3、我们不可能同时专注于两件事 4、平衡工作与生活是无稽之谈 5、怎么做 6、成功的习惯-围绕着你的终极目标 7、找到投入的意义 8、确定优先事务-这要看你目前和将来的打算 9、…

【自然语言处理】【ChatGPT系列】FLAN:微调语言模型是Zero-Shot学习器

FLAN: 微调语言模型是Zero-Shot学习器《Finetuned Language Models are Zero-shot Learners》论文地址:https://arxiv.org/abs/2109.01652 相关博客 【自然语言处理】【ChatGPT系列】FLAN:微调语言模型是Zero-Shot学习器 【自然语言处理】【ChatGPT系列】…

R语言geodetector包基于栅格图像实现地理探测器操作

本文介绍基于R语言中的geodetector包,依据多张栅格图像数据,实现地理探测器(Geodetector)操作的详细方法。 需要说明的是,在R语言中进行地理探测器操作,可以分别通过geodetector包、GD包等2个包实现。其中&…

react18+eslint+prettier 配置

新建项目 create-react-app.cmd react18 --template typescript配置别名 安装 craco npm install craco/craco -D新建 craco.config.js const path require("path"); const resolve (dir) > path.resolve(__dirname, dir); module.exports {// 配置别名web…

Kubernetes:Service

文章目录1、Service 定义1.1、无选择符的服务1.2、Endpoints2、服务发布类型2.1、ClusterIP2.2、NodePort2.3、ExternalName2.4、loadbalancer3、无头服务3.1、有选择符的服务3.2、无选择符的服务4、服务发现4.1、环境变量4.2、DNS5、Service TLSService:将运行在一…

力扣(LeetCode)1801. 积压订单中的订单总数(C++)

优先队列模拟 根据题目描述模拟。 如果该订单是一笔采购订单 buy ,则可以查看积压订单中价格 最低 的销售订单 sell 。提示我们,建立小根堆,维护价格最低的销售订单sell 。 反之亦然,如果该订单是一笔销售订单 sell ,…

【技术分享】戴尔工作站安装Win10+Ubuntu20.04双系统教程与避坑指南

文章目录引言1.安装前的几个注意事项(避坑指南)1.1.有多块硬盘,该如何分配给Win10和Ubuntu系统?1.2.Ubuntu分区应该怎么分?2.系统安装步骤2.1.下载系统镜像2.2.制作U盘启动盘2.3.进入Win10系统分配系统空间2.4.BIOS设置…

强力推荐:关于谷歌ChatGPT模型140个示例的展示与实现功能

目录 1、ChatGPT 介绍与使用简要介绍安装ChatGPT与使用想写出有效的问答吗?使用 ChatGPT 桌面应用程序使用 prompts.chat2、ChatGPT模型140个示例充当 Linux 终端充当英语翻译和改进者担任`position`面试官充当 JavaScript 控制台充当 Excel 工作表充当英语发音帮手充当旅游指…

【C++】bitset(位图)的模拟实现

目录 一、bitset接口介绍 二、bitset的实现 1. 构造函数 2. 设置位&#xff08;set&#xff09; 3. 清空位&#xff08;reset&#xff09; 4. 获取位的状态&#xff08;test&#xff09; 三、源代码 一、bitset接口介绍 #include <iostream> #include <vecto…

Fujian Medical insurance and pension for urban and rural residents

【城乡居民医保、养老】二维码缴纳步骤&#xff0c;本文仅仅辅助需要人士&#xff0c;可忽略 第一步&#xff0c;长按二维码 第二步&#xff0c;点击【识别图中二维码】 第三步&#xff1a;个人社&#xff08;医&#xff09;保办费页面&#xff0c;点击【个人社&#xff08;医&…

一次 SQL 查询优化原理分析

一&#xff0c;前言 证实 参考资料 有一张财务流水表&#xff0c;未分库分表&#xff0c;目前的数据量为9555695&#xff0c;分页查询使用到了limit&#xff0c;优化之前的查询耗时16 s 938 ms (execution: 16 s 831 ms, fetching: 107 ms)&#xff0c;按照下文的方式调整SQL…

连接表「INNER JOIN」「LEFT JOIN」「RIGHT JOIN」+ 多表查询

目录表关联执行顺序 及 原理第一步、做笛卡尔积第二步&#xff1a;根据ON后的连接条件筛选笛卡尔积的结果第三步&#xff1a;补充左表&#xff08;LEFT JOIN&#xff09;或右表&#xff08;RIGHT JOIN&#xff09;不满足连接条件的数据&#xff08;INNER JOIN内关联时无此步骤&…