public static void main(String[] args) {
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(AppClassCofig.class);
}
public AnnotationConfigApplicationContext(Class<?>... componentClasses) {
this();
register(componentClasses);
refresh();
}
public AnnotationConfigApplicationContext() {
//注册一个读取器
this.reader = new AnnotatedBeanDefinitionReader(this);
//创建一个扫描器
this.scanner = new ClassPathBeanDefinitionScanner(this);
}
一、注册读取器
this.reader = new AnnotatedBeanDefinitionReader(this);
public static Set<BeanDefinitionHolder> registerAnnotationConfigProcessors(
BeanDefinitionRegistry registry, @Nullable Object source) {
//获取DefaultListableBeanFactory,可以理解就是我们平时说的BeanFactory
DefaultListableBeanFactory beanFactory = unwrapDefaultListableBeanFactory(registry);
if (beanFactory != null) {
if (!(beanFactory.getDependencyComparator() instanceof AnnotationAwareOrderComparator)) {
//AnnotationAwareOrderComparator主要功能解析@Order注解和@Priority
beanFactory.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE);
}
if (!(beanFactory.getAutowireCandidateResolver() instanceof ContextAnnotationAutowireCandidateResolver)) {
//ContextAnnotationAutowireCandidateResolver提供处理延迟加载的功能
beanFactory.setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver());
}
}
//设置一个装BeanDefinitionHolder的容器,为什么固定是8?因为spring内部需要添加的就8个。
Set<BeanDefinitionHolder> beanDefs = new LinkedHashSet<>(8);
/*
从beanDefinitionMap里面判断是否有“配置类解析器”。添加“配置类处理器”,这个东西非常的核心,
会解析一个类中出是否是配置类,判断一个类是否是配置类可以进一步查看源码。
* */
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));
}
//添加“自动装配处理器” 解析@Autowired注解
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));
}
//添加“常见注解处理器” JSR是java规范的标准,250只是其中一个版本。
// 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));
}
//检测是否支持JPA,如果支持添加PersistenceAnnotationProcessor,PersistenceAnnotationProcessor做什么的。
if (jpaPresent && !registry.containsBeanDefinition(PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition();
def.setBeanClass(ClassUtils.forName(PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME,AnnotationConfigUtils.class.getClassLoader()));
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME));
}
//“事件监听器处理器”EventListenerProcessor 做什么用的。处理@Eventlstener注解
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));
}
//“事件监听器工厂” EventListenerFactory做什么的。
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));
}
return beanDefs;
}
1、向DefaultListableBeanFactory添加比较器,比较器的功能还是比较多的,可以控制后置处理器的执行顺序等。
2、向DefaultListableBeanFactory添加“自动装填解析器”。
3、自动装配解析器(ContextAnnotationAutowireCandidateResolver)和“自动装配后置处理器(AutowiredAnnotationBeanPostProcessor)”什么区别。
二、添加扫描器
this.scanner = new ClassPathBeanDefinitionScanner(this);
通过this创建一个扫描器。能扫描出路径上带有特殊注解的类,并且把它转换成bd
protected void registerDefaultFilters() {
this.includeFilters.add(new AnnotationTypeFilter(Component.class));
ClassLoader cl = ClassPathScanningCandidateComponentProvider.class.getClassLoader();
this.includeFilters.add(new AnnotationTypeFilter(((Class<? extends Annotation>) ClassUtils.forName("javax.annotation.ManagedBean", cl)), false));
this.includeFilters.add(new AnnotationTypeFilter(((Class<? extends Annotation>) ClassUtils.forName("javax.inject.Named", cl)), false));
}
往includeFilters添加下面3种过滤器
1、Component类型的过滤器
2、javax.annotation.ManagedBean过滤器
3、javax.inject.Named过滤器
这些过滤器会识别对应的注解@Component,@javax.annotation.ManagedBean @javax.inject.Named而且三个注解是可以相互替换的。
在使用扫描器的时候,扫描就会根据这三种过滤器来获取路径上,被扫描到的Bean