日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

重要的基础注解@import

發布時間:2024/9/30 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 重要的基础注解@import 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

@import是Spring中非常重要的基礎注解,利用它可以高度自由的定制bean裝載規則和注冊邏輯。
在第三方模塊和Spring進行整合場景下使用非常頻繁,比如EnableAsync/EnableBatchProcessing和EnableCaching都是通過Import來生效的。

它的作用總結來說有下面4種:

  • 導入容器@Configuration修飾的配置bean

  • 實例ImportBeanDefinitionRegistrar的實現類,調用其registerBeanDefinitions方法

  • 實例ImportSelector的實現類,調用其selectImports方法;

  • 可以導入一個普通的java對象,spring4.2版本之后才支持

使用舉例

@Data public class A {private String name = "a"; }@Data public class Boy {private String name = "boy"; }public class BoyImportSelector implements ImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {return new String[]{"com.sail.appstart.myimport.Boy"};} }@Data public class Dog {private String name = "dog"; }public class DogBeanDefinition implements ImportBeanDefinitionRegistrar {@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {RootBeanDefinition beanDefinition = new RootBeanDefinition(Dog.class);registry.registerBeanDefinition("Dog22", beanDefinition);} }

這里使用@import導入上面的三個類,效果就是將A,Boy,Dog三個java對象注入到spring容器中,當然也就可以通過@Autowired使用這三個bean。

@Retention(RetentionPolicy.RUNTIME) @Import({A.class, BoyImportSelector.class, DogBeanDefinition.class}) public @interface EnableAppConfig { } @EnableAppConfig // 注意要聲明這個注解,才會生效注解上面的@Import @Component public class TestImport {@Autowiredprivate A a;@Autowiredprivate Boy boy;@Autowiredprivate Dog dog;@PostConstructpublic void init() {System.out.println(a.getName());System.out.println(boy.getName());System.out.println(dog.getName());} }

使用場景

雖然聲明bean的功能可以由@Component或者@bean來實現,但是利用@Import可以控制類的注入時機,如上面只有添加@EnableAppConfig,才會導入這些bean。

所以經常出現在一些框架的自動配置里,如

  • Spring-Mybatis的@MapperScan注解,是由@Import注解所修飾,并注入了MapperScannerRegistrar類:會去掃描用戶指定的基礎包,然后提取mapper產生代理類,最后注冊到容器當中
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Documented @Import(MapperScannerRegistrar.class) public @interface MapperScan {、、、 }public class MapperScannerRegistrar implements ImportBeanDefinitionRegistrar, ResourceLoaderAware {private ResourceLoader resourceLoader;@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {List<String> basePackages = new ArrayList<String>();for (String pkg : annoAttrs.getStringArray("value")) {if (StringUtils.hasText(pkg)) {basePackages.add(pkg);}}for (String pkg : annoAttrs.getStringArray("basePackages")) {if (StringUtils.hasText(pkg)) {basePackages.add(pkg);}}for (Class<?> clazz : annoAttrs.getClassArray("basePackageClasses")) {basePackages.add(ClassUtils.getPackageName(clazz));}scanner.registerFilters();scanner.doScan(StringUtils.toStringArray(basePackages));}
  • @EnableCaching緩存開啟
    添加@EnableCaching 開啟后,才會去導入相應的包。

    @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Import(CachingConfigurationSelector.class) public @interface EnableCaching {}public class CachingConfigurationSelector extends AdviceModeImportSelector<EnableCaching> {@Overridepublic String[] selectImports(AdviceMode adviceMode) {switch (adviceMode) {case PROXY:return getProxyImports();case ASPECTJ:return getAspectJImports();default:return null;}} }

總結

以上是生活随笔為你收集整理的重要的基础注解@import的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。