• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

springboot各类源码解析

互联网 diligentman 1个月前 (03-09) 17次浏览

run方法实现只看一部分

SpringApplication.run部分源码
//创建上下文,例如包含Beanfactory,BeanDefinition等,其中BeanDefinition为初始的5个
context = createApplicationContext();
//将启动类加入到BeanDefinition中,其他功能未知(暂时不重要)
prepareContext(context, environment, listeners, applicationArguments, printedBanner);
//重要方法,加载所有BeanDefinition及bean,此处处理了各类注解
refreshContext(context);
其中refreshContext最终会调用
AbstractApplicationContext.refresh
部分源码如下
//重要方法,处理了各类注解信息将注解信息加入到BeanDefinition中,例如@bean
invokeBeanFactoryPostProcessors(beanFactory);

PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());

@Component解析由ClassPathBeanDefinitionScanner.doScan来完成

判断注解是否@Component或实现@Component的注解

重要:看注解类时一定要看注解的注释信息,注释信息上提示非常多

1.配置文件读取,

@ConfigurationProperties注解由ConfigurationPropertiesBindingPostProcessor该后置处理器来处理该注解内容

若想修改配置文件参考源码中后置方法postProcessBeforeInitialization返回的bean重新注入一个即可

有些属性配置在例如mybetis-plus可以由多个bean去修改,注意顺序逻辑

@Configuration
public class MyBeanPostProcessor implements BeanPostProcessor, PriorityOrdered, ApplicationContextAware, InitializingBean {
	
	private ApplicationContext applicationContext;

	private BeanDefinitionRegistry registry;

	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		this.applicationContext = applicationContext;
	}

	@Override
	public void afterPropertiesSet() throws Exception {
		this.registry = (BeanDefinitionRegistry) this.applicationContext.getAutowireCapableBeanFactory();
	}
	@Override
	public int getOrder() {
		return Ordered.HIGHEST_PRECEDENCE;
	}
	@Override
	public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		bind(ConfigurationPropertiesBean.get(this.applicationContext, bean, beanName));
		return bean;
	}

	private void bind(ConfigurationPropertiesBean bean) {
		if (bean == null || hasBoundValueObject(bean.getName())) {
			return;
		}
		Assert.state(bean.getBindMethod() == BindMethod.JAVA_BEAN, "Cannot bind @ConfigurationProperties for bean '"
				+ bean.getName() + "'. Ensure that @ConstructorBinding has not been applied to regular bean");
	}

	private boolean hasBoundValueObject(String beanName) {
		boolean f = this.registry.containsBeanDefinition(beanName);
		BeanDefinition  beanDefinition  = this.registry.getBeanDefinition(beanName);
		boolean ff = beanDefinition instanceof ConfigurationPropertiesValueObjectBeanDefinition;
		return f&&ff;
	}
}

ConfigurationPropertiesBindingPostProcessor后置处理器中hasBoundValueObject方法用来处理该bean是否为带@ConfigurationProperties注解的bean

由beanDefinition instanceof ConfigurationPropertiesValueObjectBeanDefinition该比较可知当容器扫描@ConfigurationProperties注解时,将该bean的定义信息为若不是ConfigurationPropertiesValueObjectBeanDefinition则使用当前方法去配置

此处查资料得知ConfigurationPropertiesValueObjectBeanDefinition为构造器绑定的定义信息,而GenericBeanDefinition则是普通的get/set

 

 

 

 

展开阅读全文

© 著作权归作者所有

举报

打赏

0


0 收藏

微信
QQ
微博

分享

作者的其它热门文章

JDK源码解析1–Object
RequestResponseBodyMethodProcessor解析
关于springboot部分配置文件不生效问题
java日记(1)——pom文件粗略解析


程序员灯塔
转载请注明原文链接:springboot各类源码解析
喜欢 (0)