- Spring源码解析(一)
- 1.AnnotationConfigApplicationContext 的构造方法--this()分析
- 2.AnnotationConfigApplicationContext 的构造方法--register()分析
- 3.AnnotationConfigApplicationContext 的构造方法--refresh()分析-未完待续
由于当前更多是使用Spring注解进行开发,所以从Spirng的注解容器AnnotationConfigApplicationContext开始分析。
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringSourceApplication.class);
Object userDao = applicationContext.getBean("userDao");
System.out.println(userDao);
}
从上面代码可以看容器实例化后就直接从容器获取Bean了,所以可以判断在容器实例化的时候已经完成了Bean的创建,所以我们直接看AnnotationConfigApplicationContext的构造方法。
1.AnnotationConfigApplicationContext 的构造方法–this()分析public AnnotationConfigApplicationContext(Class>... annotatedClasses) {
this();
register(annotatedClasses);
refresh();
}
由于AnnotationConfigApplicationContext继承了GenericApplicationContext,所以会先执行GenericApplicationContext的构造
public GenericApplicationContext() {
this.beanFactory = new DefaultListableBeanFactory();
}
在GenericApplicationContext的构造方法中,实例化了Bean工厂,并作为AnnotationConfigApplicationContext的属性存在。
接下来看AnnotationConfigApplicationContext的this方法
public AnnotationConfigApplicationContext() {
this.reader = new AnnotatedBeanDefinitionReader(this);
this.scanner = new ClassPathBeanDefinitionScanner(this);
}
在this方法中分别实例化了AnnotatedBeanDefinitionReader和ClassPathBeanDefinitionScanner,先进入AnnotatedBeanDefinitionReader
public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry, Environment environment) {
Assert.notNull(registry, "BeanDefinitionRegistry must not be null");
Assert.notNull(environment, "Environment must not be null");
this.registry = registry;
this.conditionevaluator = new Conditionevaluator(registry, environment, null);
AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
}
Conditionevaluator是用来处理@Condition注解的,后面分析到@Condition再看,接下来进入AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
if (!registry.containsBeanDefinition(CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME));
}
if (!registry.containsBeanDefinition(AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME));
}
if (!registry.containsBeanDefinition(REQUIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(RequiredAnnotationBeanPostProcessor.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, REQUIRED_ANNOTATION_PROCESSOR_BEAN_NAME));
}
// Check for JSR-250 support, and if present add the CommonAnnotationBeanPostProcessor.
if (jsr250Present && !registry.containsBeanDefinition(COMMON_ANNOTATION_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(CommonAnnotationBeanPostProcessor.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, COMMON_ANNOTATION_PROCESSOR_BEAN_NAME));
}
// Check for JPA support, and if present add the PersistenceAnnotationBeanPostProcessor.
if (jpaPresent && !registry.containsBeanDefinition(PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition();
try {
def.setBeanClass(ClassUtils.forName(PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME,
AnnotationConfigUtils.class.getClassLoader()));
}
catch (ClassNotFoundException ex) {
throw new IllegalStateException(
"Cannot load optional framework class: " + PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME, ex);
}
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME));
}
if (!registry.containsBeanDefinition(EVENT_LISTENER_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(EventListenerMethodProcessor.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_PROCESSOR_BEAN_NAME));
}
if (!registry.containsBeanDefinition(EVENT_LISTENER_FACTORY_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(DefaultEventListenerFactory.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_FACTORY_BEAN_NAME));
}
上面代码是将Spring内置的Bean定义(internalConfigurationAnnotationProcessor、internalEventListenerFactory、internalAutowiredAnnotationProcessor、internalRequiredAnnotationProcessor、internalCommonAnnotationProcessor、internalEventListenerProcessor)注册到Bean注册中心。
打断点可以看到在执行前bean定义个数为0:
执行后个数为6个:
接下来进入ClassPathBeanDefinitionScanner:
public ClassPathBeanDefinitionScanner(BeanDefinitionRegistry registry, boolean useDefaultFilters,
Environment environment, @Nullable ResourceLoader resourceLoader) {
Assert.notNull(registry, "BeanDefinitionRegistry must not be null");
this.registry = registry;
if (useDefaultFilters) {
registerDefaultFilters();
}
setEnvironment(environment);
setResourceLoader(resourceLoader);
}
进入registerDefaultFilters,通过下图看到这段代码为ClassPathBeanDefinitionScanner(Bean扫描组件)添加过滤器,只扫描加了@Component和@ManagedBean注解的类。
总结下this方法做的事情,将spring内置Bean的Bean定义放入到BeanFactory,为BeanScanner添加过滤器,接下来分析register
public void register(Class>... annotatedClasses) {
for (Class> annotatedClass : annotatedClasses) {
registerBean(annotatedClass);
}
}
annotatedClasses是我们实例化AnnotationConfigApplicationContext的时候传入的class,一般是我们的主配置类,类型于xml形式的configuration文件。
进入registerBean:
1.实例化Bean定义AnnotatedGenericBeanDefinition
2.判断该实体是否有@Condition注解,并进行处理
3.注册Bean定义
AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(annotatedClass);
if (this.conditionevaluator.shouldSkip(abd.getmetadata())) {
return;
}
abd.setInstanceSupplier(instanceSupplier);
Scopemetadata scopemetadata = this.scopemetadataResolver.resolveScopemetadata(abd);
abd.setScope(scopemetadata.getScopeName());
String beanName = (name != null ? name : this.beanNameGenerator.generateBeanName(abd, this.registry));
AnnotationConfigUtils.processCommonDefinitionAnnotations(abd);
if (qualifiers != null) {
for (Class extends Annotation> qualifier : qualifiers) {
if (Primary.class == qualifier) {
abd.setPrimary(true);
}
else if (Lazy.class == qualifier) {
abd.setLazyInit(true);
}
else {
abd.addQualifier(new AutowireCandidateQualifier(qualifier));
}
}
}
for (BeanDefinitionCustomizer customizer : definitionCustomizers) {
customizer.customize(abd);
}
BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(abd, beanName);
definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopemetadata, definitionHolder, this.registry);
BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry);
通过断点可以发现在执行完Register后加入了参数类Bean定义到BeanFactory



