<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Spring中@Import注解怎么搞?

          共 5783字,需瀏覽 12分鐘

           ·

          2021-05-16 12:05

          點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”

          優(yōu)質(zhì)文章,第一時(shí)間送達(dá)

            作者 |  口袋里的貓 

          來(lái)源 |  urlify.cn/7fa6bu

          76套java從入門到精通實(shí)戰(zhàn)課程分享

          @Import注解算是SpringBoot自動(dòng)配置原理中一個(gè)很重要的注解

          認(rèn)識(shí)@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表示要導(dǎo)入的一個(gè)或多個(gè)@Configuration類

          看注釋value通常是一個(gè)普通的組件,ConfigurationImportSelectorImportBeanDefinitionRegistrar

          搭建項(xiàng)目結(jié)構(gòu)用于測(cè)試

          1. 先創(chuàng)建一個(gè)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. 編寫測(cè)試代碼

          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({ 要導(dǎo)入的容器中的組件 } )

          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 {
          }

          這個(gè)時(shí)候運(yùn)行App已經(jīng)可以獲取到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 {
          }

          這個(gè)時(shí)候運(yùn)行App已經(jīng)可以獲取到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 {
          }

          這個(gè)時(shí)候運(yùn)行App已經(jīng)可以獲取到Tom

          最佳搭檔 - @Import通用形式

          在開(kāi)源軟件中大部分@Import中是伴隨著一個(gè)@EnableXXX使用的

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

          AppConfig.java加上@EnableTom

          @EnableTom
          @Configuration
          public class AppConfig {
          }

          這樣看起來(lái),是不是有那味了。

          其實(shí)SpringBoot的自動(dòng)配置就是@Import的一個(gè)應(yīng)用

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

          總結(jié)

          直白一點(diǎn)使用@Import注解可以快速把實(shí)例加入Spring的IOC容器中

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

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

          方法二:CustomSelector返回的類的全限定類名,實(shí)際上要導(dǎo)入到容器中的組件全類名;

          方法三:ImportBeanDefinitionRegistrar類似于第二種ImportSelector用法,只不過(guò)這種用法能自定義化注冊(cè),往容器內(nèi)注入一個(gè)BeanDefinition,然后BeanDeiniton在容器內(nèi)轉(zhuǎn)為一個(gè)實(shí)例bean;





          鋒哥最新SpringCloud分布式電商秒殺課程發(fā)布

          ??????

          ??長(zhǎng)按上方微信二維碼 2 秒





          感謝點(diǎn)贊支持下哈 

          瀏覽 40
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产一区xxx | 欧美日韩777 | 伊人色情网 | 一本久久精品一区二区 | 国产天堂视频 |