重要的基础注解@import
生活随笔
收集整理的這篇文章主要介紹了
重要的基础注解@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產生代理類,最后注冊到容器當中
-
@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;}} }
添加@EnableCaching 開啟后,才會去導入相應的包。
總結
以上是生活随笔為你收集整理的重要的基础注解@import的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java探针之修改类字节码文件
- 下一篇: spring-boot-maven-pl