Spring底层原理(五)

news2024/12/1 0:22:02

Spring底层原理(五)

本章内容

介绍Aware接口与InitializingBean接口、Bean的初始化与销毁、Scope

Aware接口

作用:用于注入一些与容器相关的信息

类名作用
BeanNameAware注入Bean的名称
BeanFactoryAware注入BeanFactory容器
ApplicationContextAware注入ApplicationContext容器
EmbeddedValueResolverAware${}

🔖 注入功能使用@Autowired就能实现,为什么还要用Aware接口呢?

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

某些情况下,扩展功能会失效,而内置功能不会失效

InitializingBean接口

该接口提供了一种内置的初始化手段,内置的注入和初始化不受拓展功能的影响,总会被执行,因此Spring框架内部的类常用它

@Autowired失效分析

Java配置类不包含BeanFactoryPostProcessor的情况

在这里插入图片描述

Java配置类包含BeanFactoryPostProcessor的情况,创建其中的BeanFactoryPostProcessor必须提前创建Java配置类,而此时的BeanPostProcessor还未准备好,导致@Autowired等注解失效

解决办法:不要使用@Autowired@PostConstruct注解,而是使用InitializingBean接口

案例代码

@Slf4j
@Configuration
public class Config2 {

    @Autowired
    public void app(ApplicationContext context) {
        log.info("===== 注入容器:{}", context);
    }

    @PostConstruct
    public void init(){
        log.info("===== 初始化");
    }

    @Bean
    public BeanFactoryPostProcessor processor1(){
        return beanFactory->{
            log.info("执行processor1");
        };
    }
}
public class A05Application {
    public static void main(String[] args) throws IOException {
        GenericApplicationContext context = new GenericApplicationContext();
        context.registerBean(AutowiredAnnotationBeanPostProcessor.class);
        context.registerBean(CommonAnnotationBeanPostProcessor.class);
        context.registerBean(ConfigurationClassPostProcessor.class);
        context.registerBean("config2",Config2.class);
        context.refresh();
        for (String name : context.getBeanDefinitionNames()) {
            System.out.println(name);
        }
        context.close();
    }
}

更正后

@Slf4j
@Configuration
public class Config2 implements InitializingBean, ApplicationContextAware {

    @Bean
    public BeanFactoryPostProcessor processor1(){
        return beanFactory->{
            log.info("执行processor1");
        };
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        log.info("===== 初始化");
    }


    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        log.info("===== 注入容器:{}", applicationContext);
    }
}
Bean的初始化与销毁
初始化
  • 使用@Bean(initMethod="")
  • 使用@PostConstruct注解
  • 使用InitializingBean接口

执行顺序:@PostConstruct @Bean(initMethod="") InitializingBean

销毁
  • 使用@Bean(distoryMethod="")
  • 使用@PreDistory注解
  • 使用DisposableBean接口

执行顺序:@PreDistory @Bean(distoryMethod="") DisposableBean

注意:Aware接口的执行时机在(初始化/销毁)注解和接口之间

Scope
Scope的类型有哪些
  • singleton:单例对象
  • prototype:原型,每次获取会创建一个新的对象
  • request:作用于Web的request作用域中,每次请求会创建一个新的对象
  • session:作用于Web的session作用域中,每个新的会话会创建一个新的对象
  • application:作用域Web的applicaion作用域中
Scope的销毁
  • singleton:当容器关闭时销毁
  • prototype:不受容器管控
  • request:每次请求结束
  • session:会话超时
  • application:没有被spring正确实现

指定Bean的作用域可以使用@Scope注解指定

Web作用域演示

在这里插入图片描述

Scope失效问题

当在singleton作用域调用其他作用域的对象时会导致其他作用域失效,原因是因为依赖注入只会注入一次

解决方案

  • 在注入的对象上使用@Lazy注解,SpringIoC容器会在启动的时候实例化所有单实例 bean 。如果我们想要实现 Spring 在启动的时候延迟加载 bean,即在首次调用bean的时候再去执行初始化
  • 指定@Scope(proxyMode=ScopedProxyMode.TARGET_CLASS)
  • 使用ObjectFactory来创建对象
  • 使用ApplicationContext获取对象

原理:都是延迟其他scope bean的获取时机

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

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

相关文章

Pycharm 对容器中的 Python 程序断点远程调试

pycharm如何连接远程服务器的docker容器有两种方法: 第一种:pycharm通过ssh连接已在运行中的docker容器 第二种:pycharm连接docker镜像,pycharm运行代码再自动创建容器 本文是第一种方法的教程,第二种请点击以上的链接…

JavaScript中BOM与DOM

BOM window对象 所有的浏览器都支持window对象,他表示浏览器窗口, 所有 JavaScript 全局对象、函数以及变量均自动成为 window 对象的成员。 全局变量是 window 对象的属性。全局函数是 window 对象的方法。 接下来要讲的HTML DOM 的 document 也是…

遥遥领先,免费开源的django4-vue3前后端分离项目

星域后台管理系统前端介绍 🌿项目简介 本项目前端基于当下流行且常用的vue3作为主要技术栈进行开发,融合了typescript和element-plus-ui,提供暗黑模式和白昼模式两种主题以及全屏切换,开发bug少,简单易学&#xff0c…

攻略合集!游戏要领你一定要知道!

大家好!作为游戏玩家,我们都希望在游戏中能够成为顶尖的高手。为了帮助大家更好地掌握游戏的要领,我要分享一些实用的攻略和技巧。 首先,不同游戏有不同的技巧和要领。对于《绝地求生》来说,我们需要注重观察和战略规划…

C++和 C 混合编程处理

原因是因为有很多功能是用 C 语言开发的,而 C是兼容 C 的,C应该能直接使用这些功能,那么我们把 C调用 C 实现的功能的这个做法,称为混合编程 但是用 C 开发的功能,很可能已经用 C 编译器编程成目标文件(或打包成库了)…

Zinx框架-游戏服务器开发001:zinx框架的安装

文章目录 1 zinx下载地址1.1 zinx框架的源码路径:1.2 安装好之后动态库的位置 2 Zinx框架运行的基本概况3 测试Zinx-框架的基本使用3.0 流程预览3.1 初始化框架3.2 标准输入回显标准输出的编写思路3.2.1 回显Echo3.2.2 写标准输入stdin通道类,用通道输入…

协同办公系统:企业提质增效的利器

随着科技的不断发展,企业对于提高工作效率、优化管理流程、降低成本的需求日益迫切。协同办公系统应运而生,成为了许多企业提质增效的利器。那么,协同办公系统究竟是如何帮助企业实现这些目标的呢?本文将从以下几个方面进行详细阐…

【基于MRA:自适应高频融合和注入系数优化:Pansharpening】

Pansharpening Based on Adaptive High-Frequency Fusion and Injection Coefficients Optimization (基于自适应高频融合和注入系数优化的全色锐化) 全色锐化的目的是将多光谱(MS)图像与全色(PAN)图像融…

【实战Flask API项目指南】之六 数据库集成 SQLAlchemy

实战Flask API项目指南之 数据库集成 本系列文章将带你深入探索实战Flask API项目指南,通过跟随小菜的学习之旅,你将逐步掌握 Flask 在实际项目中的应用。让我们一起踏上这个精彩的学习之旅吧! 前言 在上一篇文章中,我们实现了…

私有化部署即时通讯软件WorkPlus,全面适配信创环境

对于企业而言,保护数据的安全至关重要。WorkPlus即时通讯软件允许企业在自己的服务器上部署一套私有化的聊天工具,确保数据完全受控于企业内部。通过私有化部署,企业可以有效地管理和保护敏感信息,防止数据泄露和滥用。 另外&…

React基础知识02

一、通过属性来传值(props) react中可以使用属性(props)可以传递给子组件,子组件可以使用这些属性值来控制其行为和呈现输出。 例子: // 1.1 父组件 import React, { useState } from react // 1.2引入子…

浅谈安科瑞直流电表在荷兰光伏充电桩系统中的应用

摘要:本文介绍了安科瑞直流电表在荷兰光伏充电桩系统中的应用。主要用于充电桩的电流电压电能的计量。 Abstract: This article introduces the application of Acrel DC meters in PV charging pile system in Netherlands.The device is measuring current,volt…

腾讯云域名备案后,如何解析到华为云服务器Linux宝塔面板

一、购买域名并且进行备案和解析,正常情况下,购买完域名,如果找不到去哪备案,可以在腾讯云上搜索“备案”关键词就会出现了,所以这里不做详细介绍,直接进行步骤提示: 二、申请ssl证书&#xff0…

mysql简单备份和恢复

版本:mysql8.0 官方文档 :MySQL :: MySQL 8.0 Reference Manual :: 7 Backup and Recovery 1.物理备份恢复 物理备份是以数据文件形式备份。这种方式效率高点,适合大型数据库备份。物理备份可冷备可热备。 使用mysqlbackup 命令进行物理备…

命名数据网络(NDN)介绍

命名数据网络的由来 IP网络最开始其解决的问题是两个实体间点对点通信需求,实现资源共享。(简单知道即可) 随着互联网的发展,互联网用户对internet的需求现已经发生了巨大变化。目前面临着以下挑战 首先是随着以内容为中心&…

力扣刷题 day63:11-02

1.字符串中的第一个唯一字符 给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。 方法一:两次遍历哈希表 #方法一:两次遍历哈希表 def firstUniqChar(s):d{}for i in s:if …

Leetcode—707.设计链表【中等】双链表的设计明天再写

2023每日刷题(十七) Leetcode—707.设计链表 设计单链表实现代码 typedef struct Node {int val;struct Node* next; } MyLinkedList;MyLinkedList* myLinkedListCreate() {MyLinkedList* mList (MyLinkedList *)malloc(sizeof(MyLinkedList));mList-&…

知乎盈利来源分析与指标体系构建

知乎用户画像 知乎所属行业:内容社区平台 知乎上的内容涉及的领域: 婚恋情感(300亿总阅读量,截止2022年12月)、法律纠纷(200亿)、教育(200亿)、游戏(150亿&…

React实现文本框输入文字内容动态给图片添加文字信息(多个)并生成新的图片

文章目录 思路一思路二1. 下载html2canvas依赖包2. 搭建页面,并且创建新增节点的区域3. 初始化新增第一个节点到页面中的某个指定模块4. 当文本框发生变动,修改节点信息5. 实现节点删除6. 利用html2canvas将模块生成canvas,然后转化成图片 完整代码 收到…

Leetcode刷题详解——汉诺塔问题

1. 题目链接:面试题 08.06. 汉诺塔问题 2. 题目描述: 在经典汉诺塔问题中,有 3 根柱子及 N 个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放…