bean的定义与注册源码相对比较简单,本文主要根据Spring启动流程 介绍spring配置类的注册与定义
一、先看demo
/**
* spring生命周期配置类<后续会继续分析生命周期>
**/
@Configuration
@ComponentScan("com.jj.stu.spring.cycle")
@Conditional(MyCondition.class)
public class SpringCycleConfig implements InitializingBean {
public SpringCycleConfig() {
System.out.println("spring配置类实例化");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("SpringCycleConfig bean初始化接口 InitializingBean" );
}
}
/**
* 条件判断类
**/
public class MyCondition implements Condition {
/**
* 根据条件判断上下文context
*/
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
// 1.获取当前环境配置
Environment environment = context.getEnvironment();
String osName = environment.getProperty("os.name");
if (osName.equals("Windows 7")) {
// 返回true 就是能够创建该bean
return true;
}
return false;
}
}
//启动类
public class SpringCycleMain {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringCycleConfig.class);
context.close();
}
}
二、AnnotationConfigApplicationContext源码分析
直接看代码,以构造函数为切入点
//1.调用无参构造器 2.注册配置类 3.调用refresh方法
public AnnotationConfigApplicationContext(Class<?>... componentClasses) {
this();
this.register(componentClasses);
this.refresh();
}
关于配置类bean的定义与注册看前两个方法就好
顺便说一下refresh方法,对bean生命周期进行管理主要是通过这个方法,后续会讲
1.this()方法源码
public AnnotationConfigApplicationContext() {
//这个是AnnotatedBeanDefinitionReader,beandefinition读取器 重点分析
this.reader = new AnnotatedBeanDefinitionReader(this);
this.scanner = new ClassPathBeanDefinitionScanner(this);
}
//重点有两条
public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry, Environment environment) {
this.beanNameGenerator = AnnotationBeanNameGenerator.INSTANCE;
this.scopeMetadataResolver = new AnnotationScopeMetadataResolver();
Assert.notNull(registry, "BeanDefinitionRegistry must not be null");
Assert.notNull(environment, "Environment must not be null");
this.registry = registry;
//1.条件评估器 在注册时进行条件判断,后文解析doRegisterBean()时再分析源码
this.conditionEvaluator = new ConditionEvaluator(registry, environment, (ResourceLoader)null);
2.注册spring内置的后置处理器,生命周期管理基本全靠这些处理器
AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
}
AnnotationConfigUtils