@Import注解

原创
2020/08/10 11:46
阅读数 47

@Import注解

  • 作用
导入类到IOC容器中
  • 源码
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {
    Class<?>[] value();
}

  • @Import导入有3种方式
1.静态导入:
    @Import({User.class})

2.动态导入:
    实现ImportSelector接口

3.动态导入:
    实现ImportBeanDefinitionRegistrar接口
  • @Import动态导入-ImportSelector接口:

UserService.java

public class UserService {
}

DmImportSelector.java

public class DmImportSelector implements ImportSelector {

    // 返回的是IOC容器要加载的类型对应的字符串的全路径的数组
    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        // 根据不同的需求,实现不同的逻辑,返回对应的信息
        // return new String[0];
        return new String[]{UserService.class.getName()};
    }
}

EnableDmImportSelector.java

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import({DmImportSelector.class})
public @interface EnableDmImportSelector {
}

DmImportTest.java

@EnableDmImportSelector
public class DmImportTest {

    public static void main(String[] args) {
        ApplicationContext ac = new AnnotationConfigApplicationContext(DmImportTest.class);
        String[] beanDefinitionNames = ac.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames) {
            System.out.println(beanDefinitionName);
        }
    }
}
控制台输出:
dmImportTest
com.ch.demo02.UserService

  • @Import动态导入-ImportBeanDefinitionRegistrar接口:

DmImportBeanDefinitionRegistrar.java

// Bean对象的注册器
public class DmImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

    // BeanDefinitionRegistry:表示Bean对象,Bean标签对应的Java的封装对象
    @Override
    public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
        // 将需要注册的对象包装成 RootBeanDefinition
        RootBeanDefinition userService = new RootBeanDefinition(UserService.class);
        beanDefinitionRegistry.registerBeanDefinition("userService", userService);
    }
}

EnableDmImportSelector.java

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import({DmImportBeanDefinitionRegistrar.class})    // 注意这里导入的类和第二种方式的不一样
public @interface EnableDmImportSelector {
}

DmImportTest.java

@EnableDmImportSelector
public class DmImportTest {

    public static void main(String[] args) {
        ApplicationContext ac = new AnnotationConfigApplicationContext(DmImportTest.class);
        String[] beanDefinitionNames = ac.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames) {
            System.out.println(beanDefinitionName);
        }
    }
}
控制台输出:
userService
展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部