SpringBoot2.扩展接口


title: SpringBoot2.扩展接口

Spring扩展描述

判断一个框架或者程序的好坏直观的方法就是看其扩展性如何。
毫无疑问Spring扩展性这方面做的不错。
说到扩展主要还是在容器的refresh这块,也有listener(这一块先放放)
实现原则严格按照开闭原则,内部修改关闭,对扩展开放

咱们先看一张流程图
SpringBoot2.扩展接口_第1张图片
如上图中主要的画出来了具体的执行流程,下面会具体说到每一个扩展接口的使用场景

BeanDefinitionRegistryPostProcessor

通过实现下面的接口可以动态注册beanDefinition
postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)

BeanFactoryPostProcessor

通过实现下面的接口可以修改所有注册的beanDefinition
postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)

InstantiationAwareBeanPostProcessor

实现该接口方法可以用于动态代理或者增强bean
default Object postProcessBeforeInstantiation(Class beanClass, String beanName) throws BeansException {
return null;
}

用于bean中的属性值填充比如@Autowired
default PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException {
return pvs;
}

SmartInstantiationAwareBeanPostProcessor

用于判断构造器方法
determineCandidateConstructors
发生bean循环依赖依赖的时候调用
default Object getEarlyBeanReference(Object bean, String beanName) throws BeansException

ApplicationContextAwareProcessor

这里得看一段具体的代码在该类中有如下方法,可以用来获取容器的变量,用于项目中使用。

private void invokeAwareInterfaces(Object bean) {
		if (bean instanceof Aware) {
			if (bean instanceof EnvironmentAware) {
				((EnvironmentAware) bean).setEnvironment(this.applicationContext.getEnvironment());
			}
			if (bean instanceof EmbeddedValueResolverAware) {
				((EmbeddedValueResolverAware) bean).setEmbeddedValueResolver(this.embeddedValueResolver);
			}
			if (bean instanceof ResourceLoaderAware) {
				((ResourceLoaderAware) bean).setResourceLoader(this.applicationContext);
			}
			if (bean instanceof ApplicationEventPublisherAware) {
				((ApplicationEventPublisherAware) bean).setApplicationEventPublisher(this.applicationContext);
			}
			if (bean instanceof MessageSourceAware) {
				((MessageSourceAware) bean).setMessageSource(this.applicationContext);
			}
			if (bean instanceof ApplicationContextAware) {
				((ApplicationContextAware) bean).setApplicationContext(this.applicationContext);
			}
		}
	}

BeanPostProcessor

bean属性设置之前对bean实例修改
default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}

bean属性初始化之后对bean修改,aop代理类实现的地方
default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}

InitializingBean

初始化bean的时候调用,一般用来针对某个bean配置
afterPropertiesSet

欢迎扫码加入知识星球继续讨论
avatar

你可能感兴趣的:(SpringBoot2.扩展接口)