首页 > 其他分享 >Spring 扩展点

Spring 扩展点

时间:2023-04-24 16:13:13浏览次数:21  
标签:初始化 容器 Spring 扩展 ApplicationContextInitializer spring

1.背景
Spring的核心思想就是容器,当容器refresh的时候,外部看上去风平浪静,其实内部则是一片惊涛骇浪,汪洋一片。Springboot更是封装了Spring,遵循约定大于配置,加上自动装配的机制。很多时候我们只要引用了一个依赖,几乎是零配置就能完成一个功能的装配。

我非常喜欢这种自动装配的机制,所以在自己开发中间件和公共依赖工具的时候也会用到这个特性。让使用者以最小的代价接入。想要把自动装配玩的转,就必须要了解spring对于bean的构造生命周期以及各个扩展接口。当然了解了bean的各个生命周期也能促进我们加深对spring的理解。业务代码也能合理利用这些扩展点写出更加漂亮的代码。

在网上搜索spring扩展点,发现很少有博文说的很全的,只有一些常用的扩展点的说明。

所以在这篇文章里,我总结了几乎Spring & Springboot所有的扩展接口,以及各个扩展点的使用场景。并且整理出了一个bean在spring内部从被加载到最后初始化完成所有可扩展点的顺序调用图。从而我们也能窥探到bean是如何一步步加载到spring容器中的。

2.可扩展的接口启动调用顺序图
img
3.ApplicationContextInitializer

org.springframework.context.ApplicationContextInitializer

这是整个spring容器在刷新之前初始化ConfigurableApplicationContext的回调接口,简单来说,就是在容器刷新之前调用此类的initialize方法。这个点允许被用户自己扩展。用户可以在整个spring容器还没被初始化之前做一些事情。
可以想到的场景可能为,在最开始激活一些配置,或者利用这时候class还没被类加载器加载的时机,进行动态字节码注入等操作。

这个接口可以在 Spring Boot 等基于 Spring 框架的应用中使用,用于在应用启动时进行一些配置或初始化操作,例如加载配置文件、设置系统属性、注册自定义的 Bean 等。

扩展方式为:

public class TestApplicationContextInitializer implements ApplicationContextInitializer {    
    @Override    
    public void initialize(ConfigurableApplicationContext applicationContext) {    
        System.out.println("[ApplicationContextInitializer]");    
    }    
}    

因为这时候spring容器还没被初始化,所以想要自己的扩展的生效,有以下三种方式:

  • 在启动类中用springApplication.addInitializers(new TestApplicationContextInitializer())语句加入

  • 配置文件配置context.initializer.classes=com.example.demo.TestApplicationContextInitializer

  • Spring SPI扩展,在spring.factories中加入org.springframework.context.ApplicationContextInitializer=com.example.demo.TestApplicationContextInitializer

标签:初始化,容器,Spring,扩展,ApplicationContextInitializer,spring
From: https://www.cnblogs.com/cxpress/p/17349870.html

相关文章

  • spring boot 过滤器、拦截器的区别和使用
    区别:一、过滤器与拦截器的对比1.使用范围不同:过滤器是基于Servlet,而拦截器是基于Spring的,Spring框架底层又离不开Servlet,所以过滤器也能在Spring体系中使用。2.使用资源不同:拦截器有Spring的支持,能够方便的向容器中注册对象和使用对象,但是过滤器就不能。3.使用场景不同:灵活性上......
  • Springboot将自定义jar包引入pom
    Springboot将自定义jar包引入pom Springboot将自定义jar包引入pom <dependency><groupId>TrendDB_API</groupId><artifactId>TrendDB_API</artifactId><version>1.0</version>......
  • springboot项目配置多个kafka
    1.spring-kafka<dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId><version>1.3.5.RELEASE</version></dependency>2.配置文件相关信息kafka.bootstrap-servers=local......
  • 一文详解RocketMQ-Spring的源码解析与实战
    摘要:这篇文章主要介绍SpringBoot项目使用rocketmq-springSDK实现消息收发的操作流程,同时笔者会从开发者的角度解读SDK的设计逻辑。本文分享自华为云社区《RocketMQ-Spring:实战与源码解析一网打尽》,作者:勇哥java实战分享。RocketMQ是大家耳熟能详的消息队列,开源项目......
  • springboot集成redis时总报错Connection refused: no further information: localhost
    nacos上配置的关于redis的key值不是springboot需要的固定写法如:sping.redis.host=spring.redis.port=sping.redis.password=spring.redis.database=我写的是一个自定义的key如com.dream.redis.host改为springboot认识的即可其他和springboot集成的组件类似,切记......
  • 分析需要修改的地方与SpringSecurity完整流程
    分析需要修改的地方 原理初探​想要知道如何实现自己的登陆流程就必须要先知道入门案例中SpringSecurity的流程。SpringSecurity完整流程SpringSecurity完整流程SpringSecurity的原理其实就是一个过滤器链,内部包含了提供各种功能的过滤......
  • SpringSecurity从入门到精通:如何查看具体的过滤器&入门案例认证流程图讲解
    如何查看具体的过滤器  入门案例认证流程图讲解 概念速查:Authentication接口:它的实现类,表示当前访问系统的用户,封装了用户相关信息AuthenticationManager接口:定义了认证Authentication的方法UserDetailsService接口:加载用户特定数据的核心接口,里面定义了......
  • Spring Security从入门到精通:入门案例准备工作&入门案例引入Spring Secuirity
    入门案例准备工作我们先要搭建一个简单的SpringBoot工程设置父工程添加依赖<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.0</version><......
  • SpringMVC 框架总结笔记
    第一章初识SpringMVC1.1SpringMVC概述SpringMVC是Spring子框架SpringMVC是Spring为【展现层|表示层|表述层|控制层】提供的基于MVC设计理念的优秀的Web框架,是目前最主流的MVC框架。SpringMVC是非侵入式:可以使用注解让普通java对象,作为请求处理器【Controller】......
  • SpringSecurity从入门到精通:简介
    SpringSecurity从入门到精通:简介SpringSecurity是Spring家族中的一个安全管理框架,想比另外一个安全框架Shiro,它提供了更丰富的功能,社区资源也比Shiro丰富一般来说中大型的项目都是使用SpringSecurity来做安全框架,小项目有Shiro的比较多,因为想比与SpringSecurity,Shiro的......