Spring源码深入阅读AnnotationConfigApplicationContext

系统管理员 2022-12-08 14:06 266阅读 0赞

一直很好奇代码 AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SimpleBeanConfig.class);运行的时候,spring容器做了什么事情,为了搞清楚,我要看一看Spring源码剖析一下。

一、首先写一个测试方法如下:

  1. AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(StudentConfig.class);
  2. Student simpleBean = (Student) context.getBean("student");
  3. System.out.println(simpleBean.toString());

通过debug发现,spring的容器创建以及类的实例化都是在第一行代码中实现的,因此进去AnnotationConfigApplicationContext 看一下,发现构造方法中有三行代码如下:

  1. public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
  2. this();
  3. this.register(annotatedClasses);
  4. this.refresh();
  5. }

二、Spring容器管理bean

首先调用this()就是本类的构造方法,由于AnnotationConfigApplicationContext继承了GenericApplicationContext因此首先会执行GenericApplicationContext的构造方法。进入发现构造方法中初始化了自己内部的beanFactoryDefaultListableBeanFactory

  1. public GenericApplicationContext() {
  2. this.customClassLoader = false;
  3. this.refreshed = new AtomicBoolean();
  4. this.beanFactory = new DefaultListableBeanFactory();
  5. }

1.this()方法

接下来再看AnnotationConfigApplicationContext中自己的构造方法
this()调用的是本地的无参构造方法,里边有两行代码

  1. public AnnotationConfigApplicationContext() {
  2. this.reader = new AnnotatedBeanDefinitionReader(this);
  3. this.scanner = new ClassPathBeanDefinitionScanner(this);
  4. }

进入AnnotatedBeanDefinitionReader
1.1AnnotatedBeanDefinitionReader

  1. public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry) {
  2. this(registry, getOrCreateEnvironment(registry));
  3. }
  4. public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry, Environment environment) {
  5. this.beanNameGenerator = new AnnotationBeanNameGenerator();
  6. this.scopeMetadataResolver = new AnnotationScopeMetadataResolver();
  7. Assert.notNull(registry, "BeanDefinitionRegistry must not be null");
  8. Assert.notNull(environment, "Environment must not be null");
  9. this.registry = registry;
  10. this.conditionEvaluator = new ConditionEvaluator(registry, environment, (ResourceLoader)null);
  11. AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
  12. }

在最后一行中将处理注解的基础设施类放到DefaultListableBeanFactory,内容如下:
1.2AnnotationConfigUtils#registerAnnotationConfigProcessors

  1. public static Set<BeanDefinitionHolder> registerAnnotationConfigProcessors(BeanDefinitionRegistry registry, Object source) {
  2. DefaultListableBeanFactory beanFactory = unwrapDefaultListableBeanFactory(registry);
  3. if (beanFactory != null) {
  4. if (!(beanFactory.getDependencyComparator() instanceof AnnotationAwareOrderComparator)) {
  5. beanFactory.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE);
  6. }
  7. if (!(beanFactory.getAutowireCandidateResolver() instanceof ContextAnnotationAutowireCandidateResolver)) {
  8. beanFactory.setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver());
  9. }
  10. }
  11. Set<BeanDefinitionHolder> beanDefs = new LinkedHashSet(4);
  12. RootBeanDefinition def;
  13. if (!registry.containsBeanDefinition("org.springframework.context.annotation.internalConfigurationAnnotationProcessor")) {
  14. def = new RootBeanDefinition(ConfigurationClassPostProcessor.class);
  15. def.setSource(source);
  16. beanDefs.add(registerPostProcessor(registry, def, "org.springframework.context.annotation.internalConfigurationAnnotationProcessor"));
  17. }
  18. if (!registry.containsBeanDefinition("org.springframework.context.annotation.internalAutowiredAnnotationProcessor")) {
  19. def = new RootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class);
  20. def.setSource(source);
  21. beanDefs.add(registerPostProcessor(registry, def, "org.springframework.context.annotation.internalAutowiredAnnotationProcessor"));
  22. }
  23. if (!registry.containsBeanDefinition("org.springframework.context.annotation.internalRequiredAnnotationProcessor")) {
  24. def = new RootBeanDefinition(RequiredAnnotationBeanPostProcessor.class);
  25. def.setSource(source);
  26. beanDefs.add(registerPostProcessor(registry, def, "org.springframework.context.annotation.internalRequiredAnnotationProcessor"));
  27. }
  28. if (jsr250Present && !registry.containsBeanDefinition("org.springframework.context.annotation.internalCommonAnnotationProcessor")) {
  29. def = new RootBeanDefinition(CommonAnnotationBeanPostProcessor.class);
  30. def.setSource(source);
  31. beanDefs.add(registerPostProcessor(registry, def, "org.springframework.context.annotation.internalCommonAnnotationProcessor"));
  32. }
  33. if (jpaPresent && !registry.containsBeanDefinition("org.springframework.context.annotation.internalPersistenceAnnotationProcessor")) {
  34. def = new RootBeanDefinition();
  35. try {
  36. def.setBeanClass(ClassUtils.forName("org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor", AnnotationConfigUtils.class.getClassLoader()));
  37. } catch (ClassNotFoundException var6) {
  38. throw new IllegalStateException("Cannot load optional framework class: org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor", var6);
  39. }
  40. def.setSource(source);
  41. beanDefs.add(registerPostProcessor(registry, def, "org.springframework.context.annotation.internalPersistenceAnnotationProcessor"));
  42. }
  43. if (!registry.containsBeanDefinition("org.springframework.context.event.internalEventListenerProcessor")) {
  44. def = new RootBeanDefinition(EventListenerMethodProcessor.class);
  45. def.setSource(source);
  46. beanDefs.add(registerPostProcessor(registry, def, "org.springframework.context.event.internalEventListenerProcessor"));
  47. }
  48. if (!registry.containsBeanDefinition("org.springframework.context.event.internalEventListenerFactory")) {
  49. def = new RootBeanDefinition(DefaultEventListenerFactory.class);
  50. def.setSource(source);
  51. beanDefs.add(registerPostProcessor(registry, def, "org.springframework.context.event.internalEventListenerFactory"));
  52. }
  53. return beanDefs;
  54. }

1.3AnnotationConfigUtils#registerPostProcessor

  1. private static BeanDefinitionHolder registerPostProcessor(BeanDefinitionRegistry registry, RootBeanDefinition definition, String beanName) {
  2. definition.setRole(2);
  3. registry.registerBeanDefinition(beanName, definition);
  4. return new BeanDefinitionHolder(definition, beanName);
  5. }

其中registerPostProcessor(),就是注册动作,继续深入registerBeanDefinition

  1. public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) throws BeanDefinitionStoreException {
  2. this.beanFactory.registerBeanDefinition(beanName, beanDefinition);
  3. }

只有一行代码,继续入:
1.4DefaultListableBeanFactory#registerBeanDefinition

  1. public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
  2. throws BeanDefinitionStoreException {
  3. Assert.hasText(beanName, "Bean name must not be empty");
  4. Assert.notNull(beanDefinition, "BeanDefinition must not be null");
  5. if (beanDefinition instanceof AbstractBeanDefinition) {
  6. try {
  7. ((AbstractBeanDefinition) beanDefinition).validate();
  8. } catch (BeanDefinitionValidationException ex) {
  9. throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName,
  10. "Validation of bean definition failed", ex);
  11. }
  12. }
  13. //注册BeanDefinition,就是将BeanDefinition放入一个map中,key是beanName
  14. //注册之前,先查下是否被注册过
  15. BeanDefinition existingDefinition = this.beanDefinitionMap.get(beanName);
  16. //如果已经存在,那么就检查是否允许覆盖,不允许直接跑异常,允许的话就记录一些日志,然后覆盖
  17. if (existingDefinition != null) {
  18. //默认允许覆盖
  19. if (!isAllowBeanDefinitionOverriding()) {
  20. //如果bean已经被注册了,并且不允许覆盖,那么抛出异常
  21. throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName,
  22. "Cannot register bean definition [" + beanDefinition + "] for bean '" + beanName +
  23. "': There is already [" + existingDefinition + "] bound.");
  24. } else if (existingDefinition.getRole() < beanDefinition.getRole()) {
  25. // e.g. was ROLE_APPLICATION, now overriding with ROLE_SUPPORT or ROLE_INFRASTRUCTURE
  26. if (logger.isWarnEnabled()) {
  27. logger.warn("Overriding user-defined bean definition for bean '" + beanName +
  28. "' with a framework-generated bean definition: replacing [" +
  29. existingDefinition + "] with [" + beanDefinition + "]");
  30. }
  31. } else if (!beanDefinition.equals(existingDefinition)) {
  32. if (logger.isInfoEnabled()) {
  33. logger.info("Overriding bean definition for bean '" + beanName +
  34. "' with a different definition: replacing [" + existingDefinition +
  35. "] with [" + beanDefinition + "]");
  36. }
  37. } else {
  38. if (logger.isDebugEnabled()) {
  39. logger.debug("Overriding bean definition for bean '" + beanName +
  40. "' with an equivalent definition: replacing [" + existingDefinition +
  41. "] with [" + beanDefinition + "]");
  42. }
  43. }
  44. this.beanDefinitionMap.put(beanName, beanDefinition);
  45. } else {
  46. //检查bean的创建过程是否已经开始了
  47. //通过判断一个set集合是否为空,因为创建过的bean都会放到那个set中保存下
  48. if (hasBeanCreationStarted()) {
  49. // Cannot modify startup-time collection elements anymore (for stable iteration)
  50. synchronized (this.beanDefinitionMap) {
  51. this.beanDefinitionMap.put(beanName, beanDefinition);
  52. //下面4行是更新beanDefinitionNames的list
  53. List<String> updatedDefinitions = new ArrayList<>(this.beanDefinitionNames.size() + 1);
  54. updatedDefinitions.addAll(this.beanDefinitionNames);
  55. updatedDefinitions.add(beanName);
  56. this.beanDefinitionNames = updatedDefinitions;
  57. //manualSingletonNames人工注册的单例集合,也要更新
  58. if (this.manualSingletonNames.contains(beanName)) {
  59. Set<String> updatedSingletons = new LinkedHashSet<>(this.manualSingletonNames);
  60. updatedSingletons.remove(beanName);
  61. this.manualSingletonNames = updatedSingletons;
  62. }
  63. }
  64. } else {
  65. // Still in startup registration phase:仍然在启动注册阶段
  66. this.beanDefinitionMap.put(beanName, beanDefinition);
  67. this.beanDefinitionNames.add(beanName);
  68. this.manualSingletonNames.remove(beanName);
  69. }
  70. this.frozenBeanDefinitionNames = null;
  71. }
  72. if (existingDefinition != null || containsSingleton(beanName)) {
  73. resetBeanDefinition(beanName);
  74. }
  75. }

beanDefinitionMap:将注册的bean往map中存放,是个ConcurrentHashMap;
放到map之前,先查看map中是否已经存在了,如果已经存在,再判断是否允许覆盖;
如果 map中不存在,那么就put进去。

2.this.register(annotatedClasses);

接下来是AnnotationConfigApplicationContext中的第二个方法this.register,看参数以及方法名就知道是往容器中注册

  1. public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
  2. this();
  3. this.register(annotatedClasses);
  4. this.refresh();
  5. }

2.1进入到 this.register(annotatedClasses);

  1. public void register(Class<?>... annotatedClasses) {
  2. Assert.notEmpty(annotatedClasses, "At least one annotated class must be specified");
  3. this.reader.register(annotatedClasses);
  4. }

调用的是AnnotationConfigApplicationContext的注册方法
2.2进入this.reader.register(annotatedClasses);

  1. public void register(Class<?>... annotatedClasses) {
  2. Class[] var2 = annotatedClasses;
  3. int var3 = annotatedClasses.length;
  4. for(int var4 = 0; var4 < var3; ++var4) {
  5. Class<?> annotatedClass = var2[var4];
  6. this.registerBean(annotatedClass);
  7. }
  8. }

其实参数是一个数组,进行遍历调用registerBean
2.3单行直接入,跳到registerBean

  1. public void registerBean(Class<?> annotatedClass, String name, Class<? extends Annotation>... qualifiers) {
  2. //得到bean的描述信息,比如bean的注解,作用范围,是否懒加载,注入方式等
  3. AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(annotatedClass);
  4. //被条件注解@Conditional注释的bean跳过注册
  5. if (this.conditionEvaluator.shouldSkip(abd.getMetadata())) {
  6. return;
  7. }
  8. abd.setInstanceSupplier(instanceSupplier);
  9. //解析bean的Scope,比如是否单例singleton还是其他
  10. ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(abd);
  11. abd.setScope(scopeMetadata.getScopeName());
  12. //生成bean name,默认就是类名小写
  13. String beanName = (name != null ? name : this.beanNameGenerator.generateBeanName(abd, this.registry));
  14. //通过判断注解内容,设置一些公共属性,比如是否懒加载,优先级等
  15. AnnotationConfigUtils.processCommonDefinitionAnnotations(abd);
  16. if (qualifiers != null) {
  17. for (Class<? extends Annotation> qualifier : qualifiers) {
  18. if (Primary.class == qualifier) {
  19. abd.setPrimary(true);
  20. } else if (Lazy.class == qualifier) {
  21. abd.setLazyInit(true);
  22. } else {
  23. abd.addQualifier(new AutowireCandidateQualifier(qualifier));
  24. }
  25. }
  26. }
  27. for (BeanDefinitionCustomizer customizer : definitionCustomizers) {
  28. customizer.customize(abd);
  29. }
  30. BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(abd, beanName);
  31. definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);
  32. BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry);

就是获取封装以及注册

3.this.refresh();

方法名为刷新,即为刷新容器。

  1. public void refresh() throws BeansException, IllegalStateException {
  2. synchronized(this.startupShutdownMonitor) {
  3. this.prepareRefresh();
  4. ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
  5. this.prepareBeanFactory(beanFactory);
  6. try {
  7. this.postProcessBeanFactory(beanFactory);
  8. this.invokeBeanFactoryPostProcessors(beanFactory);
  9. this.registerBeanPostProcessors(beanFactory);
  10. this.initMessageSource();
  11. this.initApplicationEventMulticaster();
  12. this.onRefresh();
  13. this.registerListeners();
  14. this.finishBeanFactoryInitialization(beanFactory);
  15. this.finishRefresh();
  16. } catch (BeansException var9) {
  17. if (this.logger.isWarnEnabled()) {
  18. this.logger.warn("Exception encountered during context initialization - cancelling refresh attempt: " + var9);
  19. }
  20. this.destroyBeans();
  21. this.cancelRefresh(var9);
  22. throw var9;
  23. } finally {
  24. this.resetCommonCaches();
  25. }
  26. }
  27. }

3.1this.prepareRefresh();做一些刷新前的准备,记录时间什么的

  1. protected void prepareRefresh() {
  2. this.startupDate = System.currentTimeMillis();
  3. this.closed.set(false);
  4. this.active.set(true);
  5. if (this.logger.isInfoEnabled()) {
  6. this.logger.info("Refreshing " + this);
  7. }
  8. this.initPropertySources();
  9. this.getEnvironment().validateRequiredProperties();
  10. this.earlyApplicationEvents = new LinkedHashSet();
  11. }

3.2ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();

  1. protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
  2. this.refreshBeanFactory();
  3. ConfigurableListableBeanFactory beanFactory = this.getBeanFactory();
  4. if (this.logger.isDebugEnabled()) {
  5. this.logger.debug("Bean factory for " + this.getDisplayName() + ": " + beanFactory);
  6. }
  7. return beanFactory;
  8. }

拿到工厂类
3.3AbstractBeanFactory#addBeanPostProcessor

  1. public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor) {
  2. Assert.notNull(beanPostProcessor, "BeanPostProcessor must not be null");
  3. this.beanPostProcessors.remove(beanPostProcessor);
  4. this.beanPostProcessors.add(beanPostProcessor);
  5. if (beanPostProcessor instanceof InstantiationAwareBeanPostProcessor) {
  6. this.hasInstantiationAwareBeanPostProcessors = true;
  7. }
  8. if (beanPostProcessor instanceof DestructionAwareBeanPostProcessor) {
  9. this.hasDestructionAwareBeanPostProcessors = true;
  10. }
  11. }

addBeanPostProcessor()方法定义在AbstractBeanFactory抽象类中,Spring添加自己定义的后置处理器
通过this.beanPostProcessors.add(beanPostProcessor);将spring后置处理器全部添加到BeanPostProcessor泛型的一个list当中
private final List beanPostProcessors = new ArrayList();
3.4BeanPostProcessor接口:

  1. public interface BeanPostProcessor {
  2. Object postProcessBeforeInitialization(Object var1, String var2) throws BeansException;
  3. Object postProcessAfterInitialization(Object var1, String var2) throws BeansException;
  4. }

定义了一个前置处理器和一个后置处理器

  1. @Component
  2. public class MyBeanPostProcessor implements BeanPostProcessor, PriorityOrdered {
  3. /**
  4. * 这里拿到bean之后可以根据此bean创建一个代理类对象
  5. * AOP正是通过BeanPostProcessor和IOC容器建立起了联系
  6. * @param bean the new bean instance
  7. * @param beanName the name of the bean
  8. * @return
  9. * @throws BeansException
  10. */
  11. @Override
  12. public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
  13. if (beanName.equals("student")){
  14. System.out.println("MyBeanPostProcessor的前置处理器执行");
  15. }
  16. return bean;
  17. }
  18. @Override
  19. public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
  20. if (beanName.equals("student")){
  21. System.out.println("MyBeanPostProcessor的后置处理器执行");
  22. }
  23. return bean;
  24. }
  25. @Override
  26. public int getOrder() {
  27. return 101;
  28. }
  29. }

后置处理器的优先级通过继承接口:PriorityOrdered重写getOrder()方法来设置,数字越小优先级越高,所以bean后置处理器在AbstractBeanFactory抽象类中放在一个list的集合中,是一个列表,在创建bean的时候依次执行。
3.4postProcessBeanFactory能够更改工厂bean的一些行为,可自行扩展

3.5invokeBeanFactoryPostProcessors(beanFactory)
BeanFactoryPostProcessor能够在bean实例化之前进行一定的操作,通过”order”控制执行次序(要实现Ordered接口)。
优先处理BeanDefinitionRegistryPostProcessor其次是BeanFactoryPostProcessor

  1. protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
  2. PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, this.getBeanFactoryPostProcessors());
  3. if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean("loadTimeWeaver")) {
  4. beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
  5. beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
  6. }
  7. }

3.6registerBeanPostProcessors(beanFactory)

  1. public static void registerBeanPostProcessors(
  2. ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
  3. //从beanFactory查询之前注册的BeanPostProcessor类型的bean名字
  4. String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
  5. //实例化一个BeanPostProcessorChecker,用于记录日志信息,比如当一个bean没有被任何后置处理器处理时
  6. //BeanPostProcessorChecker是一个内部类,实现了BeanPostProcessor接口
  7. // Register BeanPostProcessorChecker that logs an info message when
  8. // a bean is created during BeanPostProcessor instantiation, i.e. when
  9. // a bean is not eligible for getting processed by all BeanPostProcessors.
  10. int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
  11. beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
  12. // Separate between BeanPostProcessors that implement PriorityOrdered,Ordered, and the rest.
  13. //这里也分为PriorityOrdered,Ordered, and 其他 3中情况分开处理;所以先遍历一遍,把类型分开;
  14. //遍历时候,顺便把PriorityOrdered实例化了
  15. List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
  16. //是否框架内部使用的PostProcessor
  17. List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
  18. List<String> orderedPostProcessorNames = new ArrayList<>();
  19. List<String> nonOrderedPostProcessorNames = new ArrayList<>();
  20. for (String ppName : postProcessorNames) {
  21. if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
  22. BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
  23. priorityOrderedPostProcessors.add(pp);
  24. if (pp instanceof MergedBeanDefinitionPostProcessor) {
  25. internalPostProcessors.add(pp);
  26. }
  27. } else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
  28. orderedPostProcessorNames.add(ppName);
  29. } else {
  30. nonOrderedPostProcessorNames.add(ppName);
  31. }
  32. }
  33. // First, register the BeanPostProcessors that implement PriorityOrdered.
  34. //首先注册实现了PriorityOrdered接口的,注册就是把实例化的ostProcessors放到容器的list结合中
  35. sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
  36. registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
  37. // Next, register the BeanPostProcessors that implement Ordered.
  38. //然后注册Ordered实现了Ordered接口的
  39. List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>();
  40. for (String ppName : orderedPostProcessorNames) {
  41. BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
  42. orderedPostProcessors.add(pp);
  43. if (pp instanceof MergedBeanDefinitionPostProcessor) {
  44. internalPostProcessors.add(pp);
  45. }
  46. }
  47. sortPostProcessors(orderedPostProcessors, beanFactory);
  48. registerBeanPostProcessors(beanFactory, orderedPostProcessors);
  49. // Now, register all regular BeanPostProcessors.
  50. //最后注册其他类型的
  51. List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>();
  52. for (String ppName : nonOrderedPostProcessorNames) {
  53. BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
  54. nonOrderedPostProcessors.add(pp);
  55. if (pp instanceof MergedBeanDefinitionPostProcessor) {
  56. internalPostProcessors.add(pp);
  57. }
  58. }
  59. registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
  60. // Finally, re-register all internal BeanPostProcessors.
  61. //最后注册内部类型的BeanPostProcessors
  62. sortPostProcessors(internalPostProcessors, beanFactory);
  63. registerBeanPostProcessors(beanFactory, internalPostProcessors);
  64. // Re-register post-processor for detecting inner beans as ApplicationListeners,
  65. // moving it to the end of the processor chain (for picking up proxies etc).
  66. //初始化一个类,用于监听器的探测
  67. beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
  68. }

实例化BeanPostProcessor,能够在bean实例化的前后进行操作
3.7finishBeanFactoryInitialization(beanFactory)

  1. protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
  2. if (beanFactory.containsBean("conversionService") && beanFactory.isTypeMatch("conversionService", ConversionService.class)) {
  3. beanFactory.setConversionService((ConversionService)beanFactory.getBean("conversionService", ConversionService.class));
  4. }
  5. if (!beanFactory.hasEmbeddedValueResolver()) {
  6. beanFactory.addEmbeddedValueResolver(new StringValueResolver() {
  7. public String resolveStringValue(String strVal) {
  8. return AbstractApplicationContext.this.getEnvironment().resolvePlaceholders(strVal);
  9. }
  10. });
  11. }
  12. String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);
  13. String[] var3 = weaverAwareNames;
  14. int var4 = weaverAwareNames.length;
  15. for(int var5 = 0; var5 < var4; ++var5) {
  16. String weaverAwareName = var3[var5];
  17. this.getBean(weaverAwareName);
  18. }
  19. beanFactory.setTempClassLoader((ClassLoader)null);
  20. beanFactory.freezeConfiguration();
  21. beanFactory.preInstantiateSingletons();
  22. }

实例化剩下的bean,完成全部bean的实例化(懒加载除外),在最后的beanFactory.preInstantiateSingletons();实现了所需类的实例化,通过debug发现是调用了AbstractBeanFactory下的getBean()方法进行的实例化,而getBean()方法又有一行调用doGetBean()的代码
3.7.1AbstractBeanFactory#doGetBean()

  1. protected <T> T doGetBean(String name, Class<T> requiredType, final Object[] args, boolean typeCheckOnly) throws BeansException {
  2. final String beanName = this.transformedBeanName(name);
  3. Object sharedInstance = this.getSingleton(beanName);
  4. Object bean;
  5. if (sharedInstance != null && args == null) {
  6. if (this.logger.isDebugEnabled()) {
  7. if (this.isSingletonCurrentlyInCreation(beanName)) {
  8. this.logger.debug("Returning eagerly cached instance of singleton bean '" + beanName + "' that is not fully initialized yet - a consequence of a circular reference");
  9. } else {
  10. this.logger.debug("Returning cached instance of singleton bean '" + beanName + "'");
  11. }
  12. }
  13. bean = this.getObjectForBeanInstance(sharedInstance, name, beanName, (RootBeanDefinition)null);
  14. } else {
  15. if (this.isPrototypeCurrentlyInCreation(beanName)) {
  16. throw new BeanCurrentlyInCreationException(beanName);
  17. }
  18. BeanFactory parentBeanFactory = this.getParentBeanFactory();
  19. if (parentBeanFactory != null && !this.containsBeanDefinition(beanName)) {
  20. String nameToLookup = this.originalBeanName(name);
  21. if (args != null) {
  22. return parentBeanFactory.getBean(nameToLookup, args);
  23. }
  24. return parentBeanFactory.getBean(nameToLookup, requiredType);
  25. }
  26. if (!typeCheckOnly) {
  27. this.markBeanAsCreated(beanName);
  28. }
  29. try {
  30. final RootBeanDefinition mbd = this.getMergedLocalBeanDefinition(beanName);
  31. this.checkMergedBeanDefinition(mbd, beanName, args);
  32. String[] dependsOn = mbd.getDependsOn();
  33. String[] var11;
  34. if (dependsOn != null) {
  35. var11 = dependsOn;
  36. int var12 = dependsOn.length;
  37. for(int var13 = 0; var13 < var12; ++var13) {
  38. String dep = var11[var13];
  39. if (this.isDependent(beanName, dep)) {
  40. throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");
  41. }
  42. this.registerDependentBean(dep, beanName);
  43. try {
  44. this.getBean(dep);
  45. } catch (NoSuchBeanDefinitionException var24) {
  46. throw new BeanCreationException(mbd.getResourceDescription(), beanName, "'" + beanName + "' depends on missing bean '" + dep + "'", var24);
  47. }
  48. }
  49. }
  50. if (mbd.isSingleton()) {
  51. sharedInstance = this.getSingleton(beanName, new ObjectFactory<Object>() {
  52. public Object getObject() throws BeansException {
  53. try {
  54. return AbstractBeanFactory.this.createBean(beanName, mbd, args);
  55. } catch (BeansException var2) {
  56. AbstractBeanFactory.this.destroySingleton(beanName);
  57. throw var2;
  58. }
  59. }
  60. });
  61. bean = this.getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
  62. } else if (mbd.isPrototype()) {
  63. var11 = null;
  64. Object prototypeInstance;
  65. try {
  66. this.beforePrototypeCreation(beanName);
  67. prototypeInstance = this.createBean(beanName, mbd, args);
  68. } finally {
  69. this.afterPrototypeCreation(beanName);
  70. }
  71. bean = this.getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
  72. } else {
  73. String scopeName = mbd.getScope();
  74. Scope scope = (Scope)this.scopes.get(scopeName);
  75. if (scope == null) {
  76. throw new IllegalStateException("No Scope registered for scope name '" + scopeName + "'");
  77. }
  78. try {
  79. Object scopedInstance = scope.get(beanName, new ObjectFactory<Object>() {
  80. public Object getObject() throws BeansException {
  81. AbstractBeanFactory.this.beforePrototypeCreation(beanName);
  82. Object var1;
  83. try {
  84. var1 = AbstractBeanFactory.this.createBean(beanName, mbd, args);
  85. } finally {
  86. AbstractBeanFactory.this.afterPrototypeCreation(beanName);
  87. }
  88. return var1;
  89. }
  90. });
  91. bean = this.getObjectForBeanInstance(scopedInstance, name, beanName, mbd);
  92. } catch (IllegalStateException var23) {
  93. throw new BeanCreationException(beanName, "Scope '" + scopeName + "' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton", var23);
  94. }
  95. }
  96. } catch (BeansException var26) {
  97. this.cleanupAfterBeanCreationFailure(beanName);
  98. throw var26;
  99. }
  100. }
  101. if (requiredType != null && bean != null && !requiredType.isInstance(bean)) {
  102. try {
  103. return this.getTypeConverter().convertIfNecessary(bean, requiredType);
  104. } catch (TypeMismatchException var25) {
  105. if (this.logger.isDebugEnabled()) {
  106. this.logger.debug("Failed to convert bean '" + name + "' to required type '" + ClassUtils.getQualifiedName(requiredType) + "'", var25);
  107. }
  108. throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
  109. }
  110. } else {
  111. return bean;
  112. }
  113. }

通过debug发现是在AbstractAutowireCapableBeanFactory中的createBean完成了bean的实例化
Object sharedInstance = this.getSingleton(beanName);//尝试从缓存中获取单例bean
3.7.2AbstractAutowireCapableBeanFactory#createBean

  1. protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args) throws BeanCreationException {
  2. if (this.logger.isDebugEnabled()) {
  3. this.logger.debug("Creating instance of bean '" + beanName + "'");
  4. }
  5. RootBeanDefinition mbdToUse = mbd;
  6. Class<?> resolvedClass = this.resolveBeanClass(mbd, beanName, new Class[0]);
  7. if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
  8. mbdToUse = new RootBeanDefinition(mbd);
  9. mbdToUse.setBeanClass(resolvedClass);
  10. }
  11. try {
  12. mbdToUse.prepareMethodOverrides();
  13. } catch (BeanDefinitionValidationException var7) {
  14. throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(), beanName, "Validation of method overrides failed", var7);
  15. }
  16. Object beanInstance;
  17. try {
  18. beanInstance = this.resolveBeforeInstantiation(beanName, mbdToUse);
  19. if (beanInstance != null) {
  20. return beanInstance;
  21. }
  22. } catch (Throwable var8) {
  23. throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName, "BeanPostProcessor before instantiation of bean failed", var8);
  24. }
  25. beanInstance = this.doCreateBean(beanName, mbdToUse, args);
  26. if (this.logger.isDebugEnabled()) {
  27. this.logger.debug("Finished creating instance of bean '" + beanName + "'");
  28. }
  29. return beanInstance;
  30. }

create中又调用doCreateBean来进行实例化操作
3.7.3AbstractAutowireCapableBeanFactory#doCreateBean

  1. protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, Object[] args) throws BeanCreationException {
  2. BeanWrapper instanceWrapper = null;
  3. if (mbd.isSingleton()) {
  4. instanceWrapper = (BeanWrapper)this.factoryBeanInstanceCache.remove(beanName);
  5. }
  6. if (instanceWrapper == null) {
  7. instanceWrapper = this.createBeanInstance(beanName, mbd, args);
  8. }
  9. final Object bean = instanceWrapper != null ? instanceWrapper.getWrappedInstance() : null;
  10. Class<?> beanType = instanceWrapper != null ? instanceWrapper.getWrappedClass() : null;
  11. mbd.resolvedTargetType = beanType;
  12. synchronized(mbd.postProcessingLock) {
  13. if (!mbd.postProcessed) {
  14. try {
  15. this.applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
  16. } catch (Throwable var17) {
  17. throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Post-processing of merged bean definition failed", var17);
  18. }
  19. mbd.postProcessed = true;
  20. }
  21. }
  22. boolean earlySingletonExposure = mbd.isSingleton() && this.allowCircularReferences && this.isSingletonCurrentlyInCreation(beanName);
  23. if (earlySingletonExposure) {
  24. if (this.logger.isDebugEnabled()) {
  25. this.logger.debug("Eagerly caching bean '" + beanName + "' to allow for resolving potential circular references");
  26. }
  27. this.addSingletonFactory(beanName, new ObjectFactory<Object>() {
  28. public Object getObject() throws BeansException {
  29. return AbstractAutowireCapableBeanFactory.this.getEarlyBeanReference(beanName, mbd, bean);
  30. }
  31. });
  32. }
  33. Object exposedObject = bean;
  34. try {
  35. this.populateBean(beanName, mbd, instanceWrapper);
  36. if (exposedObject != null) {
  37. exposedObject = this.initializeBean(beanName, exposedObject, mbd);
  38. }
  39. } catch (Throwable var18) {
  40. if (var18 instanceof BeanCreationException && beanName.equals(((BeanCreationException)var18).getBeanName())) {
  41. throw (BeanCreationException)var18;
  42. }
  43. throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Initialization of bean failed", var18);
  44. }
  45. if (earlySingletonExposure) {
  46. Object earlySingletonReference = this.getSingleton(beanName, false);
  47. if (earlySingletonReference != null) {
  48. if (exposedObject == bean) {
  49. exposedObject = earlySingletonReference;
  50. } else if (!this.allowRawInjectionDespiteWrapping && this.hasDependentBean(beanName)) {
  51. String[] dependentBeans = this.getDependentBeans(beanName);
  52. Set<String> actualDependentBeans = new LinkedHashSet(dependentBeans.length);
  53. String[] var12 = dependentBeans;
  54. int var13 = dependentBeans.length;
  55. for(int var14 = 0; var14 < var13; ++var14) {
  56. String dependentBean = var12[var14];
  57. if (!this.removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {
  58. actualDependentBeans.add(dependentBean);
  59. }
  60. }
  61. if (!actualDependentBeans.isEmpty()) {
  62. throw new BeanCurrentlyInCreationException(beanName, "Bean with name '" + beanName + "' has been injected into other beans [" + StringUtils.collectionToCommaDelimitedString(actualDependentBeans) + "] in its raw version as part of a circular reference, but has eventually been wrapped. This means that said other beans do not use the final version of the bean. This is often the result of over-eager type matching - consider using 'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example.");
  63. }
  64. }
  65. }
  66. }
  67. try {
  68. this.registerDisposableBeanIfNecessary(beanName, bean, mbd);
  69. return exposedObject;
  70. } catch (BeanDefinitionValidationException var16) {
  71. throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Invalid destruction signature", var16);
  72. }
  73. }

其中有一行代码boolean earlySingletonExposure = mbd.isSingleton() && this.allowCircularReferences && this.isSingletonCurrentlyInCreation(beanName);中的allowCircularReferences判断是否支持循环依赖,默认是true,可以通过以下代码修改循环依赖失效

  1. AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
  2. context.register(StudentConfig.class);
  3. AbstractAutowireCapableBeanFactory beanFactory = (AbstractAutowireCapableBeanFactory) context.getBeanFactory();
  4. beanFactory.setAllowCircularReferences(false);
  5. context.refresh();
  6. Student simpleBean = (Student) context.getBean("student");
  7. System.out.println(simpleBean.toString());

实例化类是通过instanceWrapper = this.createBeanInstance(beanName, mbd, args);

3.7.2getSingleton

  1. protected Object getSingleton(String beanName, boolean allowEarlyReference) {
  2. Object singletonObject = this.singletonObjects.get(beanName);
  3. if (singletonObject == null && this.isSingletonCurrentlyInCreation(beanName)) {
  4. synchronized(this.singletonObjects) {
  5. singletonObject = this.earlySingletonObjects.get(beanName);
  6. if (singletonObject == null && allowEarlyReference) {
  7. ObjectFactory<?> singletonFactory = (ObjectFactory)this.singletonFactories.get(beanName);
  8. if (singletonFactory != null) {
  9. singletonObject = singletonFactory.getObject();
  10. this.earlySingletonObjects.put(beanName, singletonObject);
  11. this.singletonFactories.remove(beanName);
  12. }
  13. }
  14. }
  15. }
  16. return singletonObject != NULL_OBJECT ? singletonObject : null;
  17. }
  18. public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
  19. Assert.notNull(beanName, "'beanName' must not be null");
  20. synchronized(this.singletonObjects) {
  21. Object singletonObject = this.singletonObjects.get(beanName);
  22. if (singletonObject == null) {
  23. if (this.singletonsCurrentlyInDestruction) {
  24. throw new BeanCreationNotAllowedException(beanName, "Singleton bean creation not allowed while singletons of this factory are in destruction (Do not request a bean from a BeanFactory in a destroy method implementation!)");
  25. }
  26. if (this.logger.isDebugEnabled()) {
  27. this.logger.debug("Creating shared instance of singleton bean '" + beanName + "'");
  28. }
  29. this.beforeSingletonCreation(beanName);
  30. boolean newSingleton = false;
  31. boolean recordSuppressedExceptions = this.suppressedExceptions == null;
  32. if (recordSuppressedExceptions) {
  33. this.suppressedExceptions = new LinkedHashSet();
  34. }
  35. try {
  36. singletonObject = singletonFactory.getObject();
  37. newSingleton = true;
  38. } catch (IllegalStateException var16) {
  39. singletonObject = this.singletonObjects.get(beanName);
  40. if (singletonObject == null) {
  41. throw var16;
  42. }
  43. } catch (BeanCreationException var17) {
  44. BeanCreationException ex = var17;
  45. if (recordSuppressedExceptions) {
  46. Iterator var8 = this.suppressedExceptions.iterator();
  47. while(var8.hasNext()) {
  48. Exception suppressedException = (Exception)var8.next();
  49. ex.addRelatedCause(suppressedException);
  50. }
  51. }
  52. throw ex;
  53. } finally {
  54. if (recordSuppressedExceptions) {
  55. this.suppressedExceptions = null;
  56. }
  57. this.afterSingletonCreation(beanName);
  58. }
  59. if (newSingleton) {
  60. this.addSingleton(beanName, singletonObject);
  61. }
  62. }
  63. return singletonObject != NULL_OBJECT ? singletonObject : null;
  64. }
  65. }

beforeSingletonCreation方法是个空实现,里面没有任何逻辑,但其实不是, 这个函数中做了一个很重要的操作:记录加载状态,也就是通过this.singletonsCurrentlylnCreation.add(beanName)将当前正要创建的bean记录在缓存中,这样便可以对循环依赖进行检测。

Spring为了解决单例的循环依赖问题,使用了三级缓存。

这三级缓存分别指:
singletonFactories : 单例对象工厂的cache
earlySingletonObjects :提前暴光的单例对象的Cache
singletonObjects:单例对象的cache

以下来源:https://blog.csdn.net/u010853261/article/details/77940767

isSingletonCurrentlyInCreation()判断当前单例bean是否正在创建中,也就是没有初始化完成(比如A的构造器依赖了B对象所以得先去创建B对象, 或则在A的populateBean过程中依赖了B对象,得先去创建B对象,这时的A就是处于创建中的状态。)
allowEarlyReference 是否允许从singletonFactories中通过getObject拿到对象
分析getSingleton()的整个过程,Spring首先从一级缓存singletonObjects中获取。如果获取不到,并且对象正在创建中,就再从二级缓存earlySingletonObjects中获取。如果还是获取不到且允许singletonFactories通过getObject()获取,就从三级缓存singletonFactory.getObject()(三级缓存)获取,如果获取到了则:

  1. this.earlySingletonObjects.put(beanName, singletonObject);
  2. this.singletonFactories.remove(beanName);

A的某个field或者setter依赖了B的实例对象,同时B的某个field或者setter依赖了A的实例对象”这种循环依赖的情况。A首先完成了初始化的第一步,并且将自己提前曝光到singletonFactories中,此时进行初始化的第二步,发现自己依赖对象B,此时就尝试去get(B),发现B还没有被create,所以走create流程,B在初始化第一步的时候发现自己依赖了对象A,于是尝试get(A),尝试一级缓存singletonObjects(肯定没有,因为A还没初始化完全),尝试二级缓存earlySingletonObjects(也没有),尝试三级缓存singletonFactories,由于A通过ObjectFactory将自己提前曝光了,所以B能够通过ObjectFactory.getObject拿到A对象(虽然A还没有初始化完全,但是总比没有好呀),B拿到A对象后顺利完成了初始化阶段1、2、3,完全初始化之后将自己放入到一级缓存singletonObjects中。此时返回A中,A此时能拿到B的对象顺利完成自己的初始化阶段2、3,最终A也完成了初始化,进去了一级缓存singletonObjects中,而且更加幸运的是,由于B拿到了A的对象引用,所以B现在hold住的A对象完成了初始化。

知道了这个原理时候,肯定就知道为啥Spring不能解决“A的构造方法中依赖了B的实例对象,同时B的构造方法中依赖了A的实例对象”这类问题了!因为加入singletonFactories三级缓存的前提是执行了构造器,所以构造器的循环依赖没法解决。

3.8finishRefresh

  1. protected void finishRefresh() {
  2. this.initLifecycleProcessor();
  3. this.getLifecycleProcessor().onRefresh();
  4. this.publishEvent((ApplicationEvent)(new ContextRefreshedEvent(this)));
  5. LiveBeansView.registerApplicationContext(this);
  6. }

完成刷新,发布事件

发表评论

表情:
评论列表 (有 0 条评论,266人围观)

还没有评论,来说两句吧...

相关阅读