1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        面試官:講講SpringBoot中的@Import注解!

        共 5731字,需瀏覽 12分鐘

         ·

        2021-05-18 17:57

        你知道的越多,不知道的就越多,業(yè)余的像一棵小草!

        成功路上并不擁擠,因為堅持的人不多。

        編輯:業(yè)余草

        cnblogs.com/pi-laoban/p/14766321.html

        推薦:https://www.xttblog.com/?p=5184

        @Import注解算是SpringBoot自動配置原理中一個很重要的注解

        認識@Import注解

        ??先看一下源碼

        @Target(ElementType.TYPE)
        @Retention(RetentionPolicy.RUNTIME)
        @Documented
        public @interface Import {

         /**
          * {@link Configuration}, {@link ImportSelector}, {@link ImportBeanDefinitionRegistrar}
          * or regular component classes to import.
          */
         Class<?>[] value();

        }

        @Import表示要導入的一個或多個@Configuration類

        看注釋value通常是一個普通的組件,Configuration,ImportSelector,ImportBeanDefinitionRegistrar

        搭建項目結構用于測試

        1. 先創(chuàng)建一個maven工程

        2. 加入依賴

        <dependencies>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.18</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>4.3.24.RELEASE</version>
            </dependency>
        </dependencies>
        1. 編寫測試代碼

        Tom.java

        @Data
        public class Tom {
            private String color;
            private Integer age;
        }

        AppConfig.java

        @Configuration
        public class AppConfig {
        }

        App.java

        public class App {
            public static void main(String[] args) {
                // 創(chuàng)建容器
                AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
                // 獲取bean
                Tom tom = context.getBean(Tom.class);
                System.out.println(tom);
            }
        }

        @Import用法

        第一種普通組件

        @Import({ 要導入的容器中的組件 } )

        CustomConfiguration.java

        @Configuration
        public class CustomConfiguration {
            @Bean
            public Tom tom() {
                Tom tom = new Tom();
                tom.setAge(11);
                tom.setColor("紅色");
                return tom;
            }
        }

        AppConfig.java加上@Import({ CustomConfiguration.class })

        @Import({ CustomConfiguration.class })
        @Configuration
        public class AppConfig {
        }

        這個時候運行App已經可以獲取到Tom

        第二種ImportSelector

        CustomSelector.java

        public class CustomSelector implements ImportSelector {

            @Override
            public String[] selectImports(AnnotationMetadata importingClassMetadata) {
                return new String[] { "com.moli.pojo.Tom" };
            }
        }

        AppConfig.java加上@Import({ CustomRegistrar.class })

        @Import({ CustomRegistrar.class })
        @Configuration
        public class AppConfig {
        }

        這個時候運行App已經可以獲取到Tom

        第三種ImportBeanDefinitionRegistrar

        CustomRegistrar.java

        public class CustomRegistrar implements ImportBeanDefinitionRegistrar {
            @Override
            public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
                BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(Tom.class);
                builder.setScope(BeanDefinition.SCOPE_SINGLETON);
                builder.addPropertyValue("color""灰色");
                builder.addPropertyValue("age""12");
                registry.registerBeanDefinition("tom", builder.getBeanDefinition());
            }
        }

        AppConfig.java加上@Import({ CustomSelector.class })

        @Import({ CustomSelector.class })
        @Configuration
        public class AppConfig {
        }

        這個時候運行App已經可以獲取到Tom

        最佳搭檔 - @Import通用形式

        在開源軟件中大部分@Import中是伴隨著一個@EnableXXX使用的

        @Target(ElementType.TYPE)
        @Retention(RetentionPolicy.RUNTIME)
        @Documented
        @Import({ CustomRegistrar.class })
        public @interface EnableTom {
        }

        AppConfig.java加上@EnableTom

        @EnableTom
        @Configuration
        public class AppConfig {
        }

        這樣看起來,是不是有那味了。

        其實SpringBoot的自動配置就是@Import的一個應用

        @SuppressWarnings("deprecation")
        @Target(ElementType.TYPE)
        @Retention(RetentionPolicy.RUNTIME)
        @Documented
        @Inherited
        @AutoConfigurationPackage
        @Import(EnableAutoConfigurationImportSelector.class)
        public @interface EnableAutoConfiguration {
            ...
        }

        總結

        直白一點使用@Import注解可以快速把實例加入Spring的IOC容器中

        其實這三種用法也算是一種用法,就是導入一個類到容器,容器根據(jù)類的注解類型等信息對不同類進行不同處理;

        方法一:導入一個Configuration組件,組件創(chuàng)建了一個Tom類的Bean;

        方法二:CustomSelector返回的類的全限定類名,實際上要導入到容器中的組件全類名;

        方法三:ImportBeanDefinitionRegistrar類似于第二種ImportSelector用法,只不過這種用法能自定義化注冊,往容器內注入一個BeanDefinition,然后BeanDeiniton在容器內轉為一個實例bean;

        瀏覽 51
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            91黄色成人视频 | 电车痴汉h动漫乃梨子 | 黄色电影中文字幕 | 日本三级欧美三级人妇英文 | 亚洲人兽| 国产第一页屁屁影院 | 极品日韩 | 九九九精品视频免费观看 | 五月丁香国产精品 | 免费草逼软件 |