暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Spring源码分析01

阿亮的日志 2017-07-18
246

近期开始学习Spring源码,刚开始从XmlBeanFactory开始,但是经研究源码发现从4.0之后貌似XmlBeanFactory这个被官方给废弃了,不得已从SpringBoot开始,恰好公司近期项目使用的就是Springboot,所以顺便也就了解下springboot的底层实现。

话不多说,先上代码

  1. //此处为Spring入口启动类

  2. @SpringBootApplication

  3. @ComponentScan(basePackages = {"com.prometheus.*"})

  4. public class AdminApplication   {

  5.    protected static final Logger logger = LoggerFactory.getLogger(AdminApplication.class);

  6.    public static void main(String[] args) {

  7.        ApplicationContext  ctx = SpringApplication.run(AdminApplication.class, args);

  8.    }

  9. }

01、我们先进入run方法

  1.    //此处将Application.class封装厂Object数组作为资源

  2.    public static ConfigurableApplicationContext run(Object source, String... args) {

  3.        return run(new Object[] { source }, args);

  4.    }

接下来创建ApplicationContext,将资源初始化

  1.    public static ConfigurableApplicationContext run(Object[] sources, String[] args) {

  2.        return new SpringApplication(sources).run(args);

  3.    }

  1. //此处将资源环境变量以及web应用类型等等初始化

  2.    public SpringApplication(Object... sources) {

  3.        initialize(sources);

  4.    }

此处代码创建ApplicationContext

  1.    protected ConfigurableApplicationContext createApplicationContext() {

  2.        Class<?> contextClass = this.applicationContextClass;

  3.        if (contextClass == null) {

  4.            try {

  5.                switch (this.webApplicationType) {

  6.                    case SERVLET:

  7.                        //此处采用反射获取WebApplicationContext

  8. //  public static final String DEFAULT_WEB_CONTEXT_CLASS = //"org.springframework."

  9. //   "boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContxt";

  10.                        contextClass = Class.forName(DEFAULT_WEB_CONTEXT_CLASS);

  11.                        break;

  12.                    case REACTIVE:

  13.                        contextClass = Class.forName(DEFAULT_REACTIVE_WEB_CONTEXT_CLASS);

  14.                        break;

  15.                    default:

  16.                        contextClass = Class.forName(DEFAULT_CONTEXT_CLASS);

  17.                }

  18.            }

  19.            catch (ClassNotFoundException ex) {

  20.                throw new IllegalStateException(

  21.                        "Unable create a default ApplicationContext, "

  22.                                + "please specify an ApplicationContextClass",

  23.                        ex);

  24.            }

  25.        }

  26.        return (ConfigurableApplicationContext) BeanUtils.instantiateClass(contextClass);

  27.    }

创建DEFAULT_WEB_CONTEXT_CLASS -->AnnotationConfigEmbeddedWebApplicationContext实例,

02、bean的构建

  1.    //构造函数

  2.    public AnnotationConfigEmbeddedWebApplicationContext() {

  3.        this.reader = new AnnotatedBeanDefinitionReader(this);

  4.        this.scanner = new ClassPathBeanDefinitionScanner(this);

  5.    }

实例化AnnotatedBeanDefinitionReader

  1.    public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry) {

  2.        this(registry, getOrCreateEnvironment(registry));

  3.    }

调用this

  1.    public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry, Environment environment) {

  2.        Assert.notNull(registry, "BeanDefinitionRegistry must not be null");

  3.        Assert.notNull(environment, "Environment must not be null");

  4.        this.registry = registry;

  5.        this.conditionEvaluator = new ConditionEvaluator(registry, environment, null);

  6.        AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);

  7.    }

实例化 ConditionEvaluator并对其属性ConditionContextImpl赋值

  1. public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry,      Environment environment) {

  2.        Assert.notNull(registry, "BeanDefinitionRegistry must not be null");

  3.        Assert.notNull(environment, "Environment must not be null");

  4.        this.registry = registry;

  5.        //实例化 ConditionEvaluator并对其属性ConditionContextImpl赋值

  6.        this.conditionEvaluator = new ConditionEvaluator(registry, environment, null);

  7.        AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);

  8.    }

方法实现如下:

  1.    public static Set<BeanDefinitionHolder> registerAnnotationConfigProcessors(

  2.            BeanDefinitionRegistry registry, @Nullable Object source) {

  3. //获取beanfactory信息,Spring IOC的核心

  4.        DefaultListableBeanFactory beanFactory = unwrapDefaultListableBeanFactory(registry);

  5.        if (beanFactory != null) {

  6.            if (!(beanFactory.getDependencyComparator() instanceof AnnotationAwareOrderComparator)) {

  7.                beanFactory.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE);

  8.            }

  9.            if (!(beanFactory.getAutowireCandidateResolver() instanceof ContextAnnotationAutowireCandidateResolver)) {

  10.                beanFactory.setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver());

  11.            }

  12.        }


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


  14.        if (!registry.containsBeanDefinition(CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)) {

  15.            RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class);

  16.            def.setSource(source);

  17.            beanDefs.add(registerPostProcessor(registry, def, CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME));

  18.        }


  19.        if (!registry.containsBeanDefinition(AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) {

  20.            RootBeanDefinition def = new RootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class);

  21.            def.setSource(source);

  22.            beanDefs.add(registerPostProcessor(registry, def, AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME));

  23.        }


  24.        if (!registry.containsBeanDefinition(REQUIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) {

  25.            RootBeanDefinition def = new RootBeanDefinition(RequiredAnnotationBeanPostProcessor.class);

  26.            def.setSource(source);

  27.            beanDefs.add(registerPostProcessor(registry, def, REQUIRED_ANNOTATION_PROCESSOR_BEAN_NAME));

  28.        }


  29.        // Check for JSR-250 support, and if present add the CommonAnnotationBeanPostProcessor.

  30.        if (jsr250Present && !registry.containsBeanDefinition(COMMON_ANNOTATION_PROCESSOR_BEAN_NAME)) {

  31.            RootBeanDefinition def = new RootBeanDefinition(CommonAnnotationBeanPostProcessor.class);

  32.            def.setSource(source);

  33.            beanDefs.add(registerPostProcessor(registry, def, COMMON_ANNOTATION_PROCESSOR_BEAN_NAME));

  34.        }


  35.        // Check for JPA support, and if present add the PersistenceAnnotationBeanPostProcessor.

  36.        if (jpaPresent && !registry.containsBeanDefinition(PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME)) {

  37.            RootBeanDefinition def = new RootBeanDefinition();

  38.            try {

  39.                def.setBeanClass(ClassUtils.forName(PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME,

  40.                        AnnotationConfigUtils.class.getClassLoader()));

  41.            }

  42.            catch (ClassNotFoundException ex) {

  43.                throw new IllegalStateException(

  44.                        "Cannot load optional framework class: " + PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME, ex);

  45.            }

  46.            def.setSource(source);

  47.            beanDefs.add(registerPostProcessor(registry, def, PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME));

  48.        }


  49.        if (!registry.containsBeanDefinition(EVENT_LISTENER_PROCESSOR_BEAN_NAME)) {

  50.            RootBeanDefinition def = new RootBeanDefinition(EventListenerMethodProcessor.class);

  51.            def.setSource(source);

  52.            beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_PROCESSOR_BEAN_NAME));

  53.        }

  54.        if (!registry.containsBeanDefinition(EVENT_LISTENER_FACTORY_BEAN_NAME)) {

  55.            RootBeanDefinition def = new RootBeanDefinition(DefaultEventListenerFactory.class);

  56.            def.setSource(source);

  57.            beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_FACTORY_BEAN_NAME));

  58.        }


  59.        return beanDefs;

  60.    }

获取到BeanFactory

  1.        DefaultListableBeanFactory beanFactory = unwrapDefaultListableBeanFactory(registry);

具体实现

  1.    private static DefaultListableBeanFactory unwrapDefaultListableBeanFactory(BeanDefinitionRegistry registry) {

  2.        if (registry instanceof DefaultListableBeanFactory) {

  3.            return (DefaultListableBeanFactory) registry;

  4.        }

  5.        else if (registry instanceof GenericApplicationContext) {

  6.            //此处 GenericApplicationContext构造函数初始化beanFactory为DefaultListableBeanFactory

  7.            return ((GenericApplicationContext) registry).getDefaultListableBeanFactory();

  8.        }

  9.        else {

  10.            return null;

  11.        }

  12.    }

以上获得了BeanFactory信息 

获取完BeanFactory以后,开始涉及到Bean定义相关的信息,beanDefinition核心如下

  • BeanDefinition bean相关的设计信息

  • BeanDefinitionHolder 封装bean定义相关信息,以及bean名称、别名等

  • BeanDefinitionRegistry 持有所有注册的bean相关信息

拆分上面的大段代码,该代码片段以及其后的代码片段创建大量的bean

  1.    private static BeanDefinitionHolder registerPostProcessor(

  2.            BeanDefinitionRegistry registry, RootBeanDefinition definition, String beanName) {


  3.        definition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);


  4.        registry.registerBeanDefinition(beanName, definition);

  5.        return new BeanDefinitionHolder(definition, beanName);

  6.    }

其中

  1. //表示注册名称为org.springframework.context.annotation.internalConfigurationAnnotationProcessor,beanClass 对应为ConfigurationClassPostProcessor的bean

  2. registry.registerBeanDefinition(beanName, definition);

接下来看下核心 registerBeanDefinition的实现,此处调用GenericApplicationContext中的方法

  1.    public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)

  2.            throws BeanDefinitionStoreException {

  3.        //此处是DefaultListableBeanFactory,spring 最核心容器之一

  4.        this.beanFactory.registerBeanDefinition(beanName, beanDefinition);

  5.    }

接下来又是大段让人头疼的代码片段,此处完成了bean的注册;

  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.            //首先完成检验

  8.                ((AbstractBeanDefinition) beanDefinition).validate();

  9.            }

  10.            catch (BeanDefinitionValidationException ex) {

  11.                throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName,

  12.                        "Validation of bean definition failed", ex);

  13.            }

  14.        }


  15.        BeanDefinition oldBeanDefinition;

  16.        //从

  17.        oldBeanDefinition = this.beanDefinitionMap.get(beanName);

  18.        if (oldBeanDefinition != null) {

  19.            if (!isAllowBeanDefinitionOverriding()) {

  20.                throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName,

  21.                        "Cannot register bean definition [" + beanDefinition + "] for bean '" + beanName +

  22.                        "': There is already [" + oldBeanDefinition + "] bound.");

  23.            }

  24.            else if (oldBeanDefinition.getRole() < beanDefinition.getRole()) {

  25.                // e.g. was ROLE_APPLICATION, now overriding with ROLE_SUPPORT or ROLE_INFRASTRUCTURE

  26.                if (this.logger.isWarnEnabled()) {

  27.                    this.logger.warn("Overriding user-defined bean definition for bean '" + beanName +

  28.                            "' with a framework-generated bean definition: replacing [" +

  29.                            oldBeanDefinition + "] with [" + beanDefinition + "]");

  30.                }

  31.            }

  32.            else if (!beanDefinition.equals(oldBeanDefinition)) {

  33.                if (this.logger.isInfoEnabled()) {

  34.                    this.logger.info("Overriding bean definition for bean '" + beanName +

  35.                            "' with a different definition: replacing [" + oldBeanDefinition +

  36.                            "] with [" + beanDefinition + "]");

  37.                }

  38.            }

  39.            else {

  40.                if (this.logger.isDebugEnabled()) {

  41.                    this.logger.debug("Overriding bean definition for bean '" + beanName +

  42.                            "' with an equivalent definition: replacing [" + oldBeanDefinition +

  43.                            "] with [" + beanDefinition + "]");

  44.                }

  45.            }

  46.            this.beanDefinitionMap.put(beanName, beanDefinition);

  47.        }

  48.        else {

  49.            if (hasBeanCreationStarted()) {

  50.                // Cannot modify startup-time collection elements anymore (for stable iteration)

  51.                synchronized (this.beanDefinitionMap) {

  52.                    this.beanDefinitionMap.put(beanName, beanDefinition);

  53.                    List<String> updatedDefinitions = new ArrayList<>(this.beanDefinitionNames.size() + 1);

  54.                    updatedDefinitions.addAll(this.beanDefinitionNames);

  55.                    updatedDefinitions.add(beanName);

  56.                    this.beanDefinitionNames = updatedDefinitions;

  57.                    if (this.manualSingletonNames.contains(beanName)) {

  58.                        Set<String> updatedSingletons = new LinkedHashSet<>(this.manualSingletonNames);

  59.                        updatedSingletons.remove(beanName);

  60.                        this.manualSingletonNames = updatedSingletons;

  61.                    }

  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 (oldBeanDefinition != null || containsSingleton(beanName)) {

  73.            resetBeanDefinition(beanName);

  74.        }

  75.    }  

完成了AnnotatedBeanDefinitionReader实例的构造,即02处Bean的构建 
接下来完成ClassPathBeanDefinitionScanner的构建

  1.    public ClassPathBeanDefinitionScanner(BeanDefinitionRegistry registry, boolean useDefaultFilters,

  2.            Environment environment, @Nullable ResourceLoader resourceLoader) {


  3.        Assert.notNull(registry, "BeanDefinitionRegistry must not be null");

  4.        this.registry = registry;


  5.        if (useDefaultFilters) {

  6.            //注册默认拦截器,将Component、ManagedBean、Named注解增加到包含过滤规则中。

  7.            registerDefaultFilters();

  8.        }

  9.        setEnvironment(environment);

  10.        //完成对resourcePatternResolver以及metadataReaderFactory的赋值操作。

  11.        setResourceLoader(resourceLoader);

  12.    }

以上算是完成了整个上下文的初始化工作


文章转载自阿亮的日志,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论