Spring boot web 应用 Bean介绍 : AutoConfigurationPackages

扫码关注公众号:Java 技术驿站

发送:vip
将链接复制到本浏览器,永久解锁本站全部文章

【公众号:Java 技术驿站】 【加作者微信交流技术,拉技术群】

Bean的基本介绍

名称

      org.springframework.boot.autoconfigure.AutoConfigurationPackages

功能

Storing auto-configuration packages for reference later (e.g. by JPA entity scanner).
保存自动配置类以供之后的使用,比如给JPA entity扫描器用来扫描开发人员通过注解@Entity定义的entity类。

引入机制

该Bean的注册主要是由如下在应用程序入口类上的注解引入的 :

    @SpringBootApplication
      => @EnableAutoConfiguration
        =>  @AutoConfigurationPackage
         => @Import(AutoConfigurationPackages.Registrar.class)

注册机制

注册时机

该Bean的注册发生在Spring boot web应用的启动过程中的如下位置 :

    SpringApplication.run()
      => refreshContext()
        => EmbeddedWebApplicationContext.refresh()
          => AbstractApplicationContext.invokeBeanFactoryPostProcessors()
            => PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors()
              => ConfigurationClassPostProcessor.processConfigBeanDefinitions()
                => ConfigurationClassBeanDefinitionReader.loadBeanDefinitions()
                  => loadBeanDefinitionsFromRegistrars()
                    => AutoConfigurationPackages内部类Registrar.registerBeanDefinitions()
                      => AutoConfigurationPackages.register()

注册逻辑

该Bean的注册逻辑如下

        // AutoConfigurationPackages 类
        // 定义Bean的名称
        private static final String BEAN = AutoConfigurationPackages.class.getName();
        /** * Programmatically registers the auto-configuration package names. * 程序方式注册自动配置包的名称。 * Subsequent invocations will add the given package names to those that have * already been registered. You can use this method to manually define the base * packages that will be used for a given BeanDefinitionRegistry. Generally it's * recommended that you don't call this method directly, but instead rely on the * default convention where the package name is set from your @EnableAutoConfiguration * configuration class or classes. * @param registry the bean definition registry * @param packageNames the package names to set , 缺省配置spring boot web应用的情况下, * 这里是应用程序入口类所在的包 */
        public static void register(BeanDefinitionRegistry registry, String... packageNames) {
            if (registry.containsBeanDefinition(BEAN)) {
                // 如果该bean已经注册,则将要注册包名称添加进去
                BeanDefinition beanDefinition = registry.getBeanDefinition(BEAN);
                ConstructorArgumentValues constructorArguments = beanDefinition
                        .getConstructorArgumentValues();
                constructorArguments.addIndexedArgumentValue(0,
                        addBasePackages(constructorArguments, packageNames));
            }
            else {
                //如果该bean尚未注册,则注册该bean,参数中提供的包名称会被设置到bean定义中去
                GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
                beanDefinition.setBeanClass(BasePackages.class);
                beanDefinition.getConstructorArgumentValues().addIndexedArgumentValue(0,
                        packageNames);
                beanDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
                registry.registerBeanDefinition(BEAN, beanDefinition);
            }
        }

来源:http://ddrv.cn

赞(0) 打赏
版权归原创作者所有,任何形式的转载请联系博主:daming_90:Java 技术驿站 » Spring boot web 应用 Bean介绍 : AutoConfigurationPackages

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏