@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