Spring底层原理(二)

Spring底层原理(二)

BeanFactory的实现
//创建BeanFactory对象
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
//注册Bean定义对象
AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(SpringConfig.class)
      .setScope("singleton").getBeanDefinition();
factory.registerBeanDefinition("config",beanDefinition);
for (String name : factory.getBeanDefinitionNames()) {
     System.out.println(name);
}

使用AnnotationConfigUtils为容器添加后置处理器

//给BeanFactory添加一些常用的后置处理器,对BeanFactory功能进行增强
AnnotationConfigUtils.registerAnnotationConfigProcessors(factory);
Spring自带的后置处理器
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
  • internalConfigurationAnnotationProcessor:对@Configuration@Bean注解进行解析处理,为BeanFactory后置处理器

  • internalAutowiredAnnotationProcessor:对@Autowired注解进行解析处理,是Bean后置处理器

  • internalCommonAnnotationProcessor:对@Resource注解进行解析处理,是Bean后置处理器

执行BeanFactory后置处理器

Map<String, BeanFactoryPostProcessor> factoryPostProcessorMap = factory.getBeansOfType(BeanFactoryPostProcessor.class);
for (BeanFactoryPostProcessor processor : factoryPostProcessorMap.values()) {
	processor.postProcessBeanFactory(factory);
}
  • 需要调用这些后置处理器的postProcessBeanFactory方法,这些处理器才会生效

BeanFactory后置处理器主要功能:补充了一些bean的定义

关联BeanBean后置处理器

factory.getBeansOfType(BeanPostProcessor.class).values().forEach(factory::addBeanPostProcessor);

Bean后置处理器:针对Bean的生命周期的各个阶段提供拓展,例如@Autowired @Resource

BeanFactry中的单例对象并不是预先就创建好的,而是第一次从容器中获取时才进行创建

Spring底层原理(二)_第1张图片

如何将这些单例bean预实例化呢?

factory.preInstantiateSingletons();
  • 该方法将所有单例对象进行预实例化

Spring底层原理(二)_第2张图片

总结

beanFactory不会做的事

  • 不会主动调用BeanFactory后置处理器
  • 不会主动添加Bean后置处理器
  • 不会主动初始化单例
  • 不会解析beanFactory,也不会解析${}#{}

bean后置处理器会有排序的逻辑

  • AnnotationConfigUtils在调用registerAnnotationConfigProcessors方法后,会自动设置一个排序比较器供后续使用
    Spring底层原理(二)_第3张图片

    //默认采用list的排序规则   
    public static void sort(List<?> list) {
       if (list.size() > 1) {
            list.sort(INSTANCE);
        }
    }
    
  • 排序时会调用后置处理器的getOrder方法,该方法会返回一个整数,根据整数排序

    • CommonAnnotationBeanPostProcessor

      this.setOrder(2147483644);
      
    • AutowiredAnnotationBeanPostProcessor

      private int order = 2147483645;
      

    所以当AutowiredResource注解同时使用时会根据后置处理器的顺序决定谁生效

  • 测试排序规则

    ArrayList<Integer> integers = new ArrayList<>();
    integers.add(2147483644);
    integers.add(2147483645);
    integers.sort(AnnotationAwareOrderComparator.INSTANCE);
    //[2147483644, 2147483645]
    
    • 数字越小优先级越高,所以@Resource的优先级更高

你可能感兴趣的:(Spring,spring,java,后端)