-
jmeter后置处理器
2021-02-27 19:43:09jmeter后置处理器 作用 当给一个请求添加后置处理器时,那么可以将前一个请求的响应结果传给后一个请求 使用场景 后一个请求需要前一个请求的响应中的结果作为参数时 实施步骤 新建测试计划,添加线程组等 在... -
BeanPostProcessor 后置处理器
2020-12-05 21:46:50BeanPostProcessor【interface】:bean的后置处理器; 在bean初始化前后进行一些处理工作;spring底层大量使用; postProcessBeforeInitialization:在初始化之前工作 postProcessAfterInitialization:在初始化...BeanPostProcessor【interface】:bean的后置处理器;
在bean初始化前后进行一些处理工作;spring底层大量使用;
-
postProcessBeforeInitialization:在初始化之前工作
-
postProcessAfterInitialization:在初始化之后工作
可以作为Bean初始化前后的回调方法;
//后置处理器:初始化前后进行处理工作 //将后置处理器加入到容器中 @Component public class MyBeanPostProcessor implements BeanPostProcessor { //在初始化之前工作 //Object bean: 可以对Bean进行再一次封装,也可以直接返回 //String beanName: Bean的名称 @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("postProcessBeforeInitialization..."+beanName+"=>"+bean); return bean; } //在初始化之后工作 @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("postProcessAfterInitialization..."+beanName+"=>"+bean); return bean; } }
-
-
BeanPostProcessor后置处理器原理以及ApplicationListener原理
2019-06-23 13:45:15BeanPostProcessor:bean后置处理器,bean创建对象初始化前后进行拦截工作的 1、BeanFactoryPostProcessor:BeanFactory的后置处理器; 在BeanFactory标准初始化之后调用;所有的bean定义已经保存加载到BeanFactory...BeanPostProcessor:bean后置处理器,bean创建对象初始化前后进行拦截工作的
1、BeanFactoryPostProcessor:BeanFactory的后置处理器;
在BeanFactory标准初始化之后调用;所有的bean定义已经保存加载到BeanFactory,但是bean的实例还没创建;BeanFactoryPostProcessor原理:
1.1 ioc容器创建对象
1.2 invokeBeanFactoryPostProcessors(BeanFactory); 执行BeanFactoryPostProcessor;
如何找到所有的BeanFactoryPostProcessor并执行他们的方法;
1.2.1 直接在BeanFactory中找到所有类型是BeanFactoryPostProcessor的组件,并执行他们的方法
1.2.2 在初始化创建其他组件前面执行2、BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor
postProcessBeanDefinitionRegistry();
在所有bean定义信息将要被加载,bean实例还未创建的;优先于BeanFactoryPostProcessor执行;
利用BeanDefinitionRegistryPostProcessor给容器中在额外添加一些组件;原理:
2.1、ioc创建对象
2.2、refresh()->invokeBeanFactoryPostProcessors(beanFactory);
2.3、从容器中获取到的BeanDefinitionRegistryPostProcessor组件。
2.3.1 依次触发所有的postProcessBeanDefinitionRegistry()方法
2.3.2 再来触发postProcessBeanFactory()方法BeanFactoryPostProcessor;
2.4、再来从容器中找到BeanFactoryPostProcessor组件;然后依次触发postProcessBeanFactory()方法3、ApplicationListener:监听容器中发布的事件。事件驱动模型开发;
public interface ApplicationListener<E extends ApplicationEvent>
监听ApplicationEvent 及其下面的子事件;步骤:
1、写一个监听器来监听某个事件(ApplicationEvent及其子类)
2、把监听器加入到容器;
3、只要容器中有相关事件的发布,我们就能监听到这个事件;
ContextRefreshedEvent:容器刷新完成(所有bean都完全创建)会发布这个事件;
ContextClosedEvent:关闭容器会发布这个事件;
4、发布一个事件;
applicationContext.publishEvent();原理:
ContextRefreshedEvent、IOCTest_Ext$1[source=自己的事件!!]、ContextClosedEvent;1、ContextRefreshedEvent事件:
1.1 容器创建对象:refresh();
1.2 finishRefresh();容器刷新完成会发布ContextRefreshedEvent
1.3 publishEvent(new ContextRefreshedEvent(this));【事件发布流程】
1.3.1 获取事件的多波器(派发器):getApplicationEventMulticaster()
1.3.2 MulticasterEvent派发事件:
1.3.3 获取到所有的ApplicationListener
for(final ApplicationListener<?> listener : getApplicationListeners(event, type))
1.3.3.1 如果有Executor,可以支持使用Executor进行异步派发;
Executor executor = getTaskExecutor();
1.3.3.2 否则,同步的方式直接执行listener方法;invokeListener(listener, event);
拿到listener回调onApplicationEvent方法;2、发布自己的事件;
3、容器关闭会发布ContextClosedEvent【事件多波器(派发器)】
1、容器创建对象:refresh();
2、initApplicationEventMulticaster();初始化ApplicationEventMulticaster;
2.1 先去容器中找到有没有id="applicationEventMultcaster"的组件;
2.2 如果没有this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
并且加入到容器中,我们就可以在其他组件要派发事件,自动注入这个applicationEventMulticaster;【容器中有哪些监听器】
1、容器创建对象:refresh();
2、registerListeners();
String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
//将listener注册到ApplicationEventMulticaster中
getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
package com.spring.ext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import com.spring.bean.Red; @ComponentScan("com.spring.ext") @Configuration public class ExtConfig { @Bean public Red blue() { return new Red(); } }
package com.spring.ext; import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationListener; import org.springframework.stereotype.Component; @Component public class MyApplicationListener implements ApplicationListener<ApplicationEvent>{ public void onApplicationEvent(ApplicationEvent event) { System.out.println("event>>>>>>>>"+event); } }
package com.spring.ext; import java.util.Arrays; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.stereotype.Component; @Component public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor { public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { System.out.println("MyBeanFactoryPostProcessor ... postProcessBeanFactory beansize="+beanFactory.getBeanDefinitionCount()); int count = beanFactory.getBeanDefinitionCount(); String[] names = beanFactory.getBeanDefinitionNames(); System.out.println("当前BeanFactory中有"+count+"个Bean"); System.out.println(Arrays.toString(names)); } }
package com.spring.ext; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor; import org.springframework.stereotype.Component; import com.spring.bean.Red; @Component public class MyBenaDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor { public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { System.out.println("MyBenaDefinitionRegistryPostProcessor ..beansize ="+beanFactory.getBeanDefinitionCount()); } public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { System.out.println(">>>>>postProcessBeanDefinitionRegistry>>>beansize="+registry.getBeanDefinitionCount()); AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Red.class).getBeanDefinition(); registry.registerBeanDefinition("hello", beanDefinition); } }
package com.spring.ext; import org.springframework.context.ApplicationEvent; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Service; @Service public class UserService { @EventListener(classes= {ApplicationEvent.class}) public void listener(ApplicationEvent event) { System.out.println("自己监听><>>>>>>"+event); } }
package com.spring.test; import org.junit.Test; import org.springframework.context.ApplicationEvent; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import com.spring.ext.ExtConfig; public class IOCTestOfExt { @Test public void test01() { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ExtConfig.class); applicationContext.publishEvent(new ApplicationEvent("自己的事件!!") { }); applicationContext.close(); } }
-
2.5、调用后置处理器
2020-08-18 23:54:41在idea中搜索了一下Spring的后置处理器(PostProcessor),找出了下图的几个 本文主要来分析红框中标出的两个,也就是在 refresh() 方法的第5步调用的后置处理器 1、后置处理器调用的时机 2、后置处理器调用的顺序 ...在idea中搜索了一下Spring的后置处理器(PostProcessor),找出了下图的几个
本文主要来分析红框中标出的两个,也就是在refresh()
方法的第5步调用的后置处理器1、后置处理器调用的时机
2、后置处理器调用的顺序
3、一个最重要的后置处理器
这个最重要的后置处理器就是
ConfigurationClassPostProcessor
1、ConfigurationClassPostProcessor的作用?
2、
4、案例读源码
(1)案例1
(2)案例2
(3)案例3
Spring Cloud中的案例一个,大家对Spring Cloud不熟悉没有关系,只需要关注Spring Framework部分就可以了
下面的代码是个 org.springframework.cloud.netflix.feign.ribbon包下的一个配置类(@Configuration),大家忽略Spring Cloud,就把它看做就是一个普通的配置类
@Configuration class DefaultFeignLoadBalancedConfiguration { @Beand @ConditionalOnMissingBean public Client feignClient(CachingSpringLoadBalancerFactory cachingFactory, SpringClientFactory clientFactory) { return new LoadBalancerFeignClient(new Client.Default(null, null), cachingFactory, clientFactory); } }
下面启动时,我们在下面的方法上打上条件断点:org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader#loadBeanDefinitionsForConfigurationClass
调用栈如下loadBeanDefinitionsForConfigurationClass:140, ConfigurationClassBeanDefinitionReader (o.s.context.annotation) loadBeanDefinitions:116, ConfigurationClassBeanDefinitionReader (o.s.context.annotation) processConfigBeanDefinitions:320, ConfigurationClassPostProcessor (o.s.context.annotation) postProcessBeanDefinitionRegistry:228, ConfigurationClassPostProcessor (o.s.context.annotation) invokeBeanDefinitionRegistryPostProcessors:272, PostProcessorRegistrationDelegate (o.s.context.support) invokeBeanFactoryPostProcessors:92, PostProcessorRegistrationDelegate (o.s.context.support) invokeBeanFactoryPostProcessors:687, AbstractApplicationContext (o.s.context.support) refresh:525, AbstractApplicationContext (o.s.context.support) refresh:122, EmbeddedWebApplicationContext (o.s.boot.context.embedded) refresh:693, SpringApplication (o.s.boot) refreshContext:360, SpringApplication (o.s.boot) run:303, SpringApplication (o.s.boot) run:1118, SpringApplication (o.s.boot) run:1107, SpringApplication (o.s.boot) main:21, AppBMain (com.yh.stu)
几种注册BD的方式
1、硬编码
通过BeanDefinitionRegistry.registerBeanDefinition硬编码的方式进行注册,通常的做法有:
1、Spring 本身在实例化AnnotationConfigApplicationContext时,根据环境情况硬编码注册4~7个BDpublic AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry, Environment environment) { ... AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry); } public static Set<BeanDefinitionHolder> registerAnnotationConfigProcessors( BeanDefinitionRegistry registry, Object source) { ... // 共注册了6个BD,即使通过 RootBeanDefinition def = new RootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class); def.setSource(source); beanDefs.add(registerPostProcessor(registry, def, AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME)); ... } private static BeanDefinitionHolder registerPostProcessor( BeanDefinitionRegistry registry, RootBeanDefinition definition, String beanName) { definition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); registry.registerBeanDefinition(beanName, definition); return new BeanDefinitionHolder(definition, beanName); }
我这里列出几个大家有个印象,后续用到这几个BD的时候知道怎么来的就可以了。
// 实现了两个接口:BeanDefinitionRegistryPostProcessor/BeanFactoryPostProcessor 1:org.springframework.context.annotation.ConfigurationClassPostProcessor // 实现了BeanPostProcessor、BeanFactoryAware、PriorityOrdered接口 2:org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor // 同2一样,实现了BeanPostProcessor、BeanFactoryAware、PriorityOrdered接口 3:org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor // 同2一样,实现了BeanPostProcessor、BeanFactoryAware、PriorityOrdered接口 4:org.springframework.context.annotation.CommonAnnotationBeanPostProcessor // 实现了SmartInitializingSingleton, ApplicationContextAware 接口 5:org.springframework.context.event.EventListenerMethodProcessor 6:org.springframework.context.event.DefaultEventListenerFactory
❓ 1-这些Spring内部的 Bean是什么时候实例化的呢?
❓ 2-自定义的 BeanFacotryPostProcessor 是什么时候实例化的呢?答1:
(1)、内部BeanFacotryPostProcessor 是在其被调用的时候利用容器(beanFactory.getBean(…))进行实例化的。
(和普通的Bean不一样,普通的Bean都是在refresh的第11阶段,即在finishBeanFactoryInitialization(beanFactory)
方法中进行的)//org.springframework.context.support.PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors public static void invokeBeanFactoryPostProcessors( ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors){ ... // 从容器中找出所有 BeanDefinitionRegistryPostProcessor 类型的BD,后续按照顺序实例化并调用(PriorityOrdered/Ordered) String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false); for (String ppName : postProcessorNames) { if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) { // 使用getBean来实例化Bean currentRegistryProcessors.add( beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class)); processedBeans.add(ppName); } } ... }
(2)、AutowiredAnnotationBeanPostProcessor 是在 refresh的第 6 阶段,即在registerBeanPostProcessors(beanFactory)方法中实例化的
//org.springframework.context.support.PostProcessorRegistrationDelegate#registerBeanPostProcessors public static void registerBeanPostProcessors( ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) { // 从容器中找出所有 BeanPostProcessor 类型的BD,后续按照顺序调用(PriorityOrdered/Ordered) String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false); ... //遍历到 org.springframework.context.annotation.internalAutowiredAnnotationProcessor for (String ppName : postProcessorNames) { if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) { // 使用getBean来实例化Bean BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); } ... }
(3)同2一样
(4)同2一样
(5)EventListenerMethodProcessor 类的实例化时在refresh() 方法的第 11 阶段,即finishBeanFactoryInitialization(beanFactory) 方法中将其作为普通的Bean进行实例化2、在容器中配置
Spring中配置Bean,在调用后置处理器 Configuration -
Day14——后置处理器
2020-01-29 15:36:40前面Day13——Bean对象的生命周期涉及到后置处理器。今天详细讲一下后置处理器。 二. 储备知识 后置处理器允许在调用初始化方法前后对bean进行额外的处理 bean后置处理器对Spring IOC容器里的所有bean实例逐一处理... -
Spring-后置处理器
2017-05-23 11:29:00【后置处理器】 1.创建一个类实现BeanPostProcessor接口 2.后置处理器声明 3.注意事项 (1)后置处理器在初始化方法前和后执行功能扩展。即使对象中没有初始化的方法,后置处理器也会被调用。 ... -
spring源码:九大后置处理器
2020-05-31 09:14:11spring在完成一个bean的初始化、实例化的过程中,会用到九个后置处理器;本文梳理出这九个后置处理器 九大后置处理器 spring在初始化的过程中,会在九个地方分别调用了五个后置处理的九个方法 第一次调用后置处理器... -
spring 的后置处理器
2019-09-12 19:43:19spring 的后置处理器 post 表示后的意思, 如 postgrel spring 的后置处理器 只要实现 BeanPostProcessor 接口, 注入到Spring IoC容器. Object postProcessBeforeInitialization(Object bean,... -
Spring之BeanFactory后置处理器
2020-07-26 16:45:09Spring之BeanFactory后置处理器 写在前面 BeanPostProcessor:bean后置处理器,bean创建对象初始化前后进行拦截工作 BeanFactoryPostProcessor => BeanFactory后置处理器 在beanFactory标准初始化之后调用 所有... -
Spring BeanFactoryPostProcess 后置处理器
2019-12-27 11:31:43Spring BeanFactoryPostProcess 后置处理器 在Spring 中有两大后置处理器,BeanFactoryPostProcessor, BeanPostProcessor, 从Spring源码中我们知道,在初始ApplicationContext的时候就添加了一个... -
BeanPostProcessor后置处理器
2018-12-16 17:23:08BeanPostProcessor是spring中的后置处理器,spring中的bean的生命周期分为:创建,初始化,销毁。其中,在bean创建,属性赋值之后,会进行bean的初始化操作,而在初始化的前后会通过BeanPostProcessor进行前置和后置... -
Spring的9处调用后置处理器
2021-03-03 16:41:39在Sping的整个生命周期中,有9个地方调用后置处理器。这些后置处理器是spring实现自定义功能或者扩展spring的核心所在 一、postProcessBeforeInitialization 该方法属于InstantiationAwareBeanPostProcessor后置... -
JMeter(二十五):正则后置处理器及逻辑循环控制器
2017-11-02 21:48:28本文主要介绍JMeter接口测试的场景设计用到的逻辑控制器、后置处理器、监听器及函数调用; 1、这篇如要细讲,截图和文字即将排满,So,简单从场景设计的脚本构成进行讲解: 2、对以上脚本进行业务分析,进入天气... -
JMeter后置处理器
2020-03-31 10:59:58后置处理器在发出采样器请求之后执行。 CSS/JQuery提取器 JSON JMESPath Extractor JSON提取器 正则表达式提取器 边界提取器 JSR233后置处理程序 JDBC后置处理程序 XPath2 Extractor XPath提取器 结果状态处理器 ... -
spring源码-第五个后置处理器笔记
2020-12-27 18:01:43在手动注入源码这篇博客中,记录的是手动注入的源码,但是实际上就是第六个后置处理器的使用;所以这篇博客就主要记录第五个后置处理器的学习; 第五个后置处理器,实际上在手动注入的时候,是和第六个后置处理器... -
Spring中的后置处理器BeanPostProcessor详解
2020-08-25 18:54:17主要介绍了Spring中的后置处理器BeanPostProcessor详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 -
Spring后置处理器BeanPostProcessor
2020-12-28 09:54:40Spring后置处理器BeanPostProcessor Spring提供了许多扩展点,如FactoryBean、Aware,这里还有BeanPostProcessor 在Spring的生命周期中,BeanPostProcessor在初始化前后处理bean。 Spring中的bean每个都会经过Bean... -
Spring后置处理器
2016-08-04 20:47:14Spring后置处理器 -
Bean 后置处理器
2019-05-17 17:24:44Bean 后置处理器可以在初始化前后对Bean进行操作。 HelloWorld.java: beans.xml: Main.java InitHelloWorld.java: -
beanpostprocessor_Spring后置处理器BeanPostProcessor
2020-11-29 00:14:53Spring中有一个接口BeanPostProcessor,该接口我们叫后置处理器,作用是在Bean对象实例化和依赖注入完毕后,在显示调用初始化方法的前后添加我们自己的逻辑。接口源码如下:一、自定义后置处理器/** * ... -
Spring 源码(十二)Spring 中核心的后置处理器
2020-01-14 15:30:12BeanFactory ...BeanFactoryPostProcessor:BeanFactory后置处理器 ConfigurationClassPostProcessor:解析配置类的BeanFactory后置处理器 Bean BeanPostProcessors:Bean 初始化前后执行的后置处理器 ... -
Jmeter 常用后置处理器使用
2020-09-26 10:52:00我们在做接口测试的时候,难免会遇到一个接口的请求参数是另一个接口的响应结果,这个时候就需要用到后置处理器来处理我们的请求参数,本篇将介绍常用后置处理器的基本使用。 一、后置处理器 1.正则表达式提取器 ... -
SringIOC中Bean的后置处理器
2018-08-03 23:50:34Bean后置处理器 Spring提供的特殊的Bean 1、 Bean后置处理器允许在调用初始化方法 即:bean节点init-method属性对应的方法的前后,对Bean进行额外的处理. 2、Bean后置处理器对IOC容器里的所有Bean实例逐一处理,... -
Jmeter后置处理器实现过程及方法应用
2020-09-08 15:15:24主要介绍了Jmeter后置处理器实现过程及方法应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 -
BeanPostProcessor后置处理器原理与应用
2021-02-01 09:38:04BeanPostProcessor后置处理器原理与应用 BeanPostProcessor又叫后置处理器,是spring框架极其重要的概念。本身是个接口,接口里面定义了两个方法。许多扩展功能都是基于这种后置处理器的方式来实现的。spring框架会... -
AES 解密后置处理器
2019-08-12 12:45:01一.AES 解密后置处理器截图: 二.AES 解密后置处理器使用说明: 密码:AES解密密码; 填充算法:CBC NOPADDING; 目标变量名:如上图AES解密结果存放到aesDecrypt变量中,使用时,以${aesDecrypt}这种形式引用即可... -
jmeter——后置处理器
2020-12-29 00:18:051 后置处理器 1.1 什么是关联? 将请求1的输出 作为 请求2 的输入,则称之为关联,就是接口之间数据存在依赖关系 例如:“用户登录”请求中服务器返回了token,“查询用户信息”请求需要把token返回给服务器进行... -
spring后置处理器BeanPostProcessor和bean生命周期
2020-11-09 19:09:501.后置处理器BeanPostProcessor可以使bean在被创建之前和之后先运行一段代码 首先,实现一个继承了BeanPostProcessor的类,类中实现了postProcessBeforeInitialization和postProcessAfterInitialization两个方法 /* ... -
spring后置处理器
2019-01-12 14:27:09bean的后置处理器,主要在bean初始化前后工作。接口定义: public interface BeanPostProcessor { // 在初始化方法(如:afterPropertiesSet 或 init-method)执行前触发 @Nullable default Object ... -
Spring后置处理器之-BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor
2018-11-12 18:28:46BeanPostProcessor:bean后置处理器,bean创建对象初始化前后进行拦截工作的 参考博客:Spring后置处理器之-BeanPostProcessor BeanFactoryPostProcessor是什么:beanFactory的后置处理器; * 在BeanFactory标准...