SpringBoot
的@Enable*
开头的注解底层依赖于@Import
注解导入一些类,使用@Import
导入的类会被Spring
加载到IOC
容器中,
4种用法
- 直接导入Bean就比较简单了,新建一个
User
类
public class User{
private String name;
private String address;
}
然后在启动类上使用@Import
注解导入即可
@SpringBootApplication
@Import(User.class)
public class Application {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(Application.class,args);
System.out.println(context.getBean(User.class));
}
}
这里需要注意的是,通过上下文获取Bean时,需要使用Bean的class,因为通过Bean的方式导入,Spring存入IOC容器,是用类的全类名存储的。可以使用上下文的
getBeansOfType
方法查看,返回的是Map对象。
{com.tenghu.sbc.entity.User=User(name=null, age=0)}
从返回的结果可以看出,key
就是存的User
的全类名。
- 通过配置类导入
Bean
,创建一个配置类;
public class UserConfig {
@Bean(name = "user")
public User user(){
return new User();
}
}
然后通过@Import
导入这个配置类
@SpringBootApplication
@Import(UserConfig.class)
public class Application {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(Application.class,args);
System.out.println(context.getBean(User.class));
}
}
通过配置类的方式可以在配置类里面定义多个Bean
,当导入配置类时,配置类下定义的Bean
都会被导入。
- 导入
ImportSelector
实现类
public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
return new String[]{User.class.getName()};
}
}
实现ImportSelector
类,必须实现selectImports
,然后返回需要导入的Bean
。与上面一样使用@Import
导入这个实现类。
@Import(MyImportSelector.class)
- 导入
ImportBeanDefinitionRegistrar
实现类
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
BeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(User.class).getBeanDefinition();
registry.registerBeanDefinition("user",beanDefinition);
}
}
使用方式一样,通过@Import
导入
@Import(MyImportBeanDefinitionRegistrar.class)