spring boot 1.5.3 源代码 - 对注解支持的核心点

37 篇文章 0 订阅
18 篇文章 0 订阅

 

1、spring boot 对注解的支持是由《context命名空间》的功能来支撑的

2、spring boot 在如下地方注册《context命名空间》的功能



org.springframework.boot.SpringApplication.run(...)
{
    org.springframework.boot.SpringApplication.prepareContext(...)
    {
        org.springframework.boot.SpringApplication.prepareContext(...)
        {
            org.springframework.boot.SpringApplication.load(...)
            {
                BeanDefinitionLoader loader = createBeanDefinitionLoader(getBeanDefinitionRegistry(context), sources);
                {
                    
                    this.annotatedReader = new AnnotatedBeanDefinitionReader(registry); //  --- 对注解的核心支持
                    {
                        public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry, Environment environment) {
                            // ...
                            AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
                            {
                                public static Set<BeanDefinitionHolder> registerAnnotationConfigProcessors(BeanDefinitionRegistry registry, Object source) 
                                {

                                    DefaultListableBeanFactory beanFactory = unwrapDefaultListableBeanFactory(registry);
                                    if (beanFactory != null) {
                                        if (!(beanFactory.getDependencyComparator() instanceof AnnotationAwareOrderComparator)) {
                                            beanFactory.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE); // 处理order的属性,org.springframework.core.annotation.AnnotationAwareOrderComparator
                                        }
                                        if (!(beanFactory.getAutowireCandidateResolver() instanceof ContextAnnotationAutowireCandidateResolver)) {
                                            beanFactory.setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver()); // 处理@Qualifier注解的类
                                        }
                                    }

                                    Set<BeanDefinitionHolder> beanDefs = new LinkedHashSet<BeanDefinitionHolder>(4);

                                    if (!registry.containsBeanDefinition(CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)) {
                                        RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class); // 处理@Configuration注解的类
                                        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); // 字段或方法上有 @Autowired注解、 @Value注解、@Inject注解
                                        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); // “有@Required注解,但是没有配置值”,那么抛出异常
                                        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); // 字段或方法上有 @WebServiceRef、@EJB、@Resource注解、方法上的 @PostConstruct、@PreDestroy注解
                                        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 {
                                            // 处理JPA注解
                                            def.setBeanClass(ClassUtils.forName(PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME,
                                                    AnnotationConfigUtils.class.getClassLoader())); // 字段或方法上有 @PersistenceContext、@PersistenceUnit注解
                                        }
                                        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); // 方法上有 @EventListener 注解 
                                        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));
                                    }

                                    return beanDefs;
                                }

                            }
                        }

                    }

                    // ....
                }

            }

        }
    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值