日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Spring常用注解@Import的三種使用方式,你都了解了嗎?

環(huán)境:SpringBoot2.6.12

站在用戶的角度思考問題,與客戶深入溝通,找到烏當網(wǎng)站設計與烏當網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都網(wǎng)站制作、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名注冊、網(wǎng)絡空間、企業(yè)郵箱。業(yè)務覆蓋烏當?shù)貐^(qū)。

三種方法說明

  1. 直接導入普通數(shù)組的方式
  2. 導入ImportSelector類方式
  3. 導入ImportBeanDefinitionRegistrar方式

被導入的類加入到Spring IOC容器中。

直接導入普通數(shù)組的方式

public class A {
  @Bean
  public B b() {
    return new B() ;
  }

在配置類中導入上面的類

@Import({A.class})
@Configuration
public class ImportConfig {
}

這樣A,B都被Spring IOC容器管理了。這里可以導入多個類。

注意:在Spring4.2之前的版本中被導入的類必須是配置類也就是類上有@Configuration注解,4.2后的版本隨意一個普通類也可以。

測試

@Resource
private A a ;
@Resource
private B b ;
  
@Test
public void testImport() {
  System.out.println("a = " + a) ;
  System.out.println("b = " + b) ;
}

圖片

沒問題,能正常的輸出。

注意,請看下面的示例:

public class ImportMain {


  static class Person{
  }
  
  static class A{
    @Bean
    public Person p() {
      Person person = new Person();
      System.out.println("p(), " + person) ;
      return person ;
    }
    @Bean
    public Date d() {
      Person p = p() ;
      System.out.println("d(), " + p) ;
      return new Date() ;
    }
  }
  @Import({A.class})
  @Configuration
  static class AppConfig {
  }
}

在上面的示例中在d()方法中調(diào)用p()方法,那這里得到的Person對象和p()方法中定義的是同一個嗎?

在上面的代碼中一定不是同一個,輸出如下:

p(), com.pack.main.importaware.ImportMain$Person@18dfcc1
p(), com.pack.main.importaware.ImportMain$Person@19f7dcf
d(), com.pack.main.importaware.ImportMain$Person@19f7dcf

分別是兩個不同的對象,如何解決呢?我們只需要在A類上添加@Configuration即可,添加了該類后Spring容器首先會對當前的A這個類創(chuàng)建代理,當我們在A這個類中調(diào)用其它方法的時候會通過攔截器BeanMethodInterceptor進行攔截;在該攔截器中會根據(jù)你調(diào)用的方法來確定對應的beanName,然后在容器中查找是否有對應的Bean,如果有則直接返回,所以就確保了在當前類中你不管調(diào)用多少次其它@Bean方法都能保證是同一個對象。

導入ImportSelector類方式

通過實現(xiàn)ImportSelector接口

public class E {
  @Bean
  public G g() {
    return new G() ;
  }
}
public class F {
}
public class G {
}

配置類

@Import({C.class, A.class})
@Configuration
public class ImportConfig {
}

實現(xiàn)ImportSelector接口

public class C implements ImportSelector {


  @Override
  public String[] selectImports(AnnotationMetadata importingClassMetadata) {
    return new String[] {"com.pack.import_annotation.E", "com.pack.import_annotation.F"};
  }


}

這里的返回值中必須是完整的包名+類名

注意:這里可以返回空的String數(shù)組(length = 0),但是不能返回null。實現(xiàn)ImportSelector該接口的這個本身是不會被注冊為Bean的。

測試

@Resource
private E e ;
@Resource
private F f ;
@Resource
private G g ;
  
@Test
public void testImport() {
  System.out.println("e = " + e) ;
  System.out.println("f = " + f) ;
  System.out.println("g = " + g) ;
}

圖片

導入ImportBeanDefinitionRegistrar方式

public class H implements ImportBeanDefinitionRegistrar {


  @Override
  public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
    GenericBeanDefinition beanDefinition = new GenericBeanDefinition() ;
    beanDefinition.setBeanClass(X.class) ;
    // 給X這個類配置屬性name值
    beanDefinition.getPropertyValues().addPropertyValue("name", "張三") ;
    // x 為當前X類在Spring容器中的beanName
    registry.registerBeanDefinition("x", beanDefinition) ;
  }


}

配置類

public class X {
  
  private String name ;


  public String getName() {
    return name;
  }


  public void setName(String name) {
    this.name = name;
  }
  
}
@Import({C.class, A.class, H.class})
@Configuration
public class ImportConfig {
}

測試:

圖片

注意:實現(xiàn)ImportBeanDefinitionRegistrar該接口本身這個類是不會被注冊為Bean的。

完畢!!!


本文題目:Spring常用注解@Import的三種使用方式,你都了解了嗎?
網(wǎng)站鏈接:http://m.5511xx.com/article/codgdsc.html