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
微博
微博
分享