Spring应用扩展 Bean的作用域 作用域 说 明 singleton 默认值。 Spring以单例模式创建Bean的实例,即容器中该Bean的实例只有一个 prototype 每次从容器中获取Bean时,都会创建一个新的实例 request 用于Web应用环境,针对每次HTTP请求都会创建一个实例 Spring默认不进行自动装配,必须显式指定依赖对象 byName 根据属性名自动装配。 Spring 自动查找与属性名相同的id,如果找到,则自动注入,否则什么都不做 byType 根据属性的类型自动装配。 Spring 自动查找与属性类型相同的Bean,如果刚好找到唯一的那个,则自动注入;如果找到多个与属性类型相同的Bean,则抛出异常;如果没找到,就什么也不做 constructor 和byType类似
Spring Boot使用的时候,有时候为业务方提供一些基础服务,比如监控,告警等,为了降低业务接入难度,就需要使用Spring Factories扩展机制 使用方式 启动类:com.tenmao.FactoriesApplication shardingsphere扩展 org.apache.shardingsphere.shardingjdbc.spring.boot.SpringBootConfiguration @Configuration 其他常见第三方库 这些库都用到Spring Factories扩展机制 sharding-jdbc-spring-boot-starte mybatis-plus-boot-starter redisson 其他扩展点 Sprig Boot扩展 # Auto Configure(这个扩展是使用的最多的,特别是是一些公共SDK,会这借助这扩展实现Bean的自动注入) org.springframework.boot.autoconfigure.EnableAutoConfiguration Boot的扩展机制之Spring Factories 利用spring.factories机制加载Bean
说起spring,想必每个开发人员都用过,spring是除了jdk之外java编程中最必不可少的基础框架,其优秀的编码方式和编程思想,值得每个技术人员学习和参考。 spring给我们提供了很多扩展接口,方便我们开发过程中spring容器启动时或者启动结束做一些事情。此篇我们想要讲的是BeanPostProcessor接口的原理和使用方式。 总结 BeanPostProcessor是Spring IOC容器给我们提供的一个扩展接口。 spring扩展接口中还有一个BeanFactoryPostProcessor与BeanPostProcessor比较类似,使用方式基本相似但是作用时机有所不同,实现BeanFactoryPostProcessor 接口,可以在spring的bean创建之前,修改bean的定义属性,BeanFactoryPostProcessor是在spring容器加载了bean的定义文件之后,在bean实例化之前执行的。
文章目录 Pre org.springframework.beans.factory.DisposableBean 使用场景 源码解析 扩展示例 ---- Pre Spring Boot - 扩展接口一览 * *
A Spring-managed bean may also implement Java's {@link AutoCloseable} interface * for the other beans to release their resources as well. */ void destroy() throws Exception; } ---- 使用场景 扩展点只有一个方法 ---- 源码解析 当Spring容器销毁时,会将容器中的所有单例bean先全部销。 DisposableBeanAdapter对象中获取当前bean对象转化成DisposableBean对象,然后直接调用destroy()方法;然后再通过反射调用bean配置的destroyMethod方法 ---- 扩展示例
org.springframework.beans.factory.FactoryBean FactoryBean中的设计模式----工厂方法模式 FactoryBean VS BeanFactory 源码解析 扩展示例 ---- Pre Spring Boot - 扩展接口一览 org.springframework.beans.factory.FactoryBean package org.springframework.beans.factory Spring为此提供了一个org.springframework.bean.factory.FactoryBean的工厂类接口,用户可以通过实现该接口定制实例化Bean的逻辑。 FactoryBean接口对于Spring框架来说占用重要的地位,Spring自身就提供了70多个FactoryBean的实现。隐藏了实例化一些复杂bean的细节,给上层应用带来了便利。 return object; } OK , DONE ---- 扩展示例 package com.artisan.bootspringextend.testextends; import lombok.Getter
文章目录 Pre org.springframework.beans.factory.SmartInitializingSingleton 触发时机 使用场景 源码解析 扩展示例 ---- Pre Spring Boot - 扩展接口一览 ---- org.springframework.beans.factory.SmartInitializingSingleton public interface ---- 使用场景 可以扩展此接口在对所有单例对象初始化完毕后,做一些后置的业务处理 ---- 源码解析 org.springframework.context.support.AbstractApplicationContext Spring自己扫描出来的 * * BeanFactoryPostProcessor按类型又可以分为: * 1. // 所有的非懒加载单例bean都创建完成之后调用 smartSingleton.afterSingletonsInstantiated(); } } } ---- 扩展示例
registerBeanPostProcessors PostProcessorRegistrationDelegate.registerBeanPostProcessors 回调BeanPostProcessors的时机源码解析 扩展示例 小结 ---- Pre Spring Boot - 扩展接口一览 ---- Bean的生成过程 ---- org.springframework.beans.factory.config.BeanPostProcessor if (current == null) { return result; } result = current; } return result; } ---- 扩展示例 22:07:40.333 INFO 12876 --- [ main] c.a.b.t.ExtendBeanPostProcessor : beanName: spring.info-org.springframework.boot.autoconfigure.info.ProjectInfoProperties 22:07:40.333 INFO 12876 --- [ main] c.a.b.t.ExtendBeanPostProcessor : beanName: spring.info-org.springframework.boot.autoconfigure.info.ProjectInfoProperties
---- Pre Spring Boot - 扩展接口一览 ---- org.springframework.beans.factory.config.BeanFactoryPostProcessor 这个接口是beanFactory的扩展接口,调用时机在spring在读取beanDefinition信息之后,实例化bean之前。 在这个时机,用户可以通过实现这个扩展接口来自行处理一些东西,比如修改已经注册的beanDefinition的元信息 package org.springframework.beans.factory.config 在实例化之前,spring允许我们通过自定义扩展来改变bean的定义,定义一旦变了,后面的实例也就变了,而beanFactory后置处理器BeanFactoryPostProcessor就是用来改变bean BeanFactoryPostProcessor实现类不要做与bean实例有关的操作,而是做一些与bean定义有关的操作,例如修改某些字段的值,这样后面实例化的bean的就会有相应的改变; ---- 扩展方式
InstantiationAwareBeanPostProcessor 注册过程源码分析 postProcessBeforeInstantiation的执行时机源码解析 使用场景 : 创建代理类 ---- Pre Spring Boot - 扩展接口一览 ---- org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor 注意下 接口继承了BeanPostProcess接口 , 从方法上我们也可以看出 InstantiationAwareBeanPostProcessor 做了一些扩展 。 BeanPostProcess接口只在bean的初始化阶段进行扩展(注入spring上下文前后),而InstantiationAwareBeanPostProcessor接口在此基础上增加了3个方法,使得扩展接口可以在实例化阶段和属性注入阶段 上下文之前 postProcessAfterInitialization:初始化bean之后,相当于把bean注入spring上下文之后 ---- InstantiationAwareBeanPostProcessor
ApplicationContextInitializer接口的实现类在Spring上下文refresh之前会被调用,利用这个扩展能力可以实现对Spring上下文的修改 初始化扩展类 一般在初始化类中可以实现 NonNull String name) { return getSource().get(name); } }); } } Spring {}", age); } } 注意:这里注入了一个变量age,这个变量是从自定义的配置源Map<Sting, String>获取到的 启动方式一(推荐):resources/META-INF/spring.factories //添加初始化器 application.addInitializers(new TenmaoInitializer()); application.run(args); } 参考 spring 扩展点之五:ApplicationContextInitializer实现与使用
文章目录 Pre org.springframework.beans.factory.InitializingBean 源码解析 扩展示例 ---- Pre Spring Boot - 扩展接口一览 这个扩展点的触发时机在postProcessAfterInitialization之前 使用场景举例: 实现此接口来进行系统启动的时候一些业务指标的初始化工作。 通过反射调用 initMethod 指定方法 invokeCustomInitMethod(beanName, bean, mbd); } } } ---- 扩展示例
Spring事务扩展篇 活用ThreadLocal ThreadLocal实现原理 使用ThreadLocal管理多数据源切换条件 活用Strategy模式 理解Strategy模式 分布式事务 整体架构概览 ---- 本系列文章: Spring事务管理—下 Spring事务管理—中 Spring事务管理—上 Spring事务王国概览 ---- 之前我们已经深度剖析了Spring局部事务的实现,但是懂了实现还不够 ,我们需要从Spring的实现中学习到一些好用的设计思想,本篇文章就是来总结一下Spring事务设计的精华思想。 Spring还在很多地方用到了策略模式: bean实例化过程中,会根据情况决定使用反射还是cglib,InstantiationStrategy是容器使用的实例化策略的抽象接口,Spring默认提供了 ---- 整体架构概览 对于Spring而言,其只提供了对分布式事务的顶层类封装,方便将其纳入原本的Spring的事务管理中,该类就是JtaTransactionManager AbstractPlatformTransactionManager
- Pre Spring Boot - 扩展接口一览 ---- org.springframework.context.support.ApplicationContextAwareProcessor 个人认为这个Aware没必要去扩展,因为spring内部都可以通过注入的方式来直接获得。 这个对象也可以通过spring注入的方式来获得。 MessageSourceAware:用于获取MessageSource的一个扩展类,MessageSource主要用来做国际化。 ApplicationContextAware:用来获取ApplicationContext的一个扩展类, ApplicationContext应该是很多人非常熟悉的一个类了,就是spring上下文管理器 ,可以手动的获取任何在spring上下文注册的bean,我们经常扩展这个接口来缓存spring上下文,包装成静态方法。
spring中bean的扩展点 经历了一系列复杂的spring应用后,你的项目可能已经用上注解,也用上了xxx.properties,你对这神奇的用法感到欣喜,但你不知道他是怎么被实现的,现在就让我们来揭开这些神秘的面纱 BeanDefinition与BeanFactory扩展 在Spring生成bean的过程这篇文章中,我们了解了spring在生成bean前会先生成bean的定义,然后注册到BeanFactory中,再之后才能生成 接口应用 这个接口spring不建议用户直接实现,如果必须在这些扩展点应用自己的回调函数,spring建议继承InstantiationAwareBeanPostProcessorAdapter,重写相应的方法即可 扩展点在spring中的注入 前三小节我们了解了很多扩展点,那这些扩展点中的接口是怎么在spring中生效的呢,换句话说在什么时候被调用或被添加到BeanFactory中等待调用呢? 小节 下面由一张图来总结一下扩展点之间的调用顺序。 ?
文章目录 Pre org.springframework.beans.factory.BeanNameAware 触发点&使用场景 源码分析 扩展示例 ---- Pre Spring Boot - 扩展接口一览 Spring - BeanFactoryAware扩展接口 ---- org.springframework.beans.factory.BeanNameAware public interface } 触发点&使用场景 触发点在bean的初始化之前,也就是postProcessBeforeInitialization之前,这个类的触发点方法只有一个:setBeanName 使用场景为:用户可以扩展这个点 ,在初始化bean之前拿到spring容器中注册的的beanName,来自行修改这个beanName的值。 ((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this); } } } 扩展示例
文章目录 Pre org.springframework.context.ApplicationContextInitializer扩展点 扩展接口 扩展生效方式 方式一 : Spring SPI扩展 方式二 : 配置文件 方式三 :启动类手工add 测试结果 ---- Pre Spring Boot - 扩展接口一览 org.springframework.context.ApplicationContextInitializer 扩展点 package org.springframework.context; /** * Callback interface for initializing a Spring {@link 实现这个接口可以在整个spring容器还没被初始化之前搞事情。 方式一 : Spring SPI扩展 在spring.factories中加入 org.springframework.context.ApplicationContextInitializer=com.artisan.bootspringextend.testextends.ExtendApplicationContextInitializer
org.springframework.beans.factory.config.SmartInstantiationAwareBeanPostProcessor 类关系 SmartInstantiationAwareBeanPostProcessor接口方法 扩展示例 ---- Pre Spring Boot - 扩展接口一览 ---- org.springframework.beans.factory.config.SmartInstantiationAwareBeanPostProcessor beanName) throws BeansException { return bean; } } 类关系 SmartInstantiationAwareBeanPostProcessor接口方法 该扩展接口有 > beanClass, String beanName) 在postProcessBeforeInstantiation之前(一般不太需要扩展这个点),这个方法用于预测Bean的类型,返回第一个预测成功的 可以扩展这个点,来自定义选择相应的构造器来实例化这个bean。
文章目录 Pre org.springframework.beans.factory.BeanFactoryAware 扩展点说明 Aware接口 Spring内建Aware接口的执行时机及顺序 源码解析 (直接调用) 源码分析 (BeanPostProcessor调用执行顺序) 扩展点示例 ---- Pre Spring Boot - 扩展接口一览 ---- org.springframework.beans.factory.BeanFactoryAware 扩展点方法为setBeanFactory,可以拿到BeanFactory这个属性。 web内建的Aware接口 ServletContextAware ServletConfigAware Spring其它内建Aware接口 SchedulerContextAware (spring scheduling) NotificationPublisherAware (spring jmx export) BootstrapContextAware (spring jca) ---- Spring
这都依赖于Spring提供的XML Schema可扩展机制,用户可以自定义XML Schema文件,并自定义XML Bean解析器,并集成到SpringIOC容器中。 创建自定义扩展,主要有以下步骤: 1、创建XML Schema 文件,描述自定义的合法构建模块,也就是xsd文件,主要用于定义数据约束; 2、自定义个处理器类,并实现NamespaceHandler 接口,在里面注册各个标签对应的BeanDefinitionParser; 3、自定义一个或多个解析器,实现BeanDefinitionParser接口,用于定义Bean的解析逻辑; Spring扩展机制 前面已经介绍了Spring扩展机制的原理,dubbo也就是利用这种机制与spring实现集成的,下面简单介绍这个流程 XML Schema文件 dubbo的XML Schema文件位于dubbo-config Spring在实例化Bean的时候预留了很多接口,也就是生命周期函数,在实例化Bean的时候可以进行各种扩展,dubbo也就是借助这些接口完成了很多的功能。
小编说:本文使用Spring Session实现了Spring Boot水平扩展,每个Spring Boot应用与其他水平扩展的Spring Boot一样,都能处理用户请求。 我们称这种部署方式为水平扩展,前端通过Nginx提供反向代理,会话管理可以通过Spring Session,使用Redis来存放Session。 水平扩展 优点:成本便宜; 缺点:更多的应用导致管理更加复杂。对于Spring Boot 应用,会话管理是一个难点。 Spring Boot 应用水平扩展有两个问题需要解决,一个是将用户的请求派发到水平部署的任意一台Spring Boot应用,通常用一个反向代理服务器来实现,本文将使用Nginx作为反向代理服务器。 Boot应用,并分别以9000和9001两个端口启动,然后在Spring Session的基础上一步步来完成Spring Boot应用的水平扩展。