@ImportResouce 和 @Import 在springboot中的使用
@Import注解可以导入类(bean会被spring容器托管),也可以导入配置类(配置类中的所有bean会被spring容器托管)
@ImportResouce注解加载XML配置文件
1、@ImportResouce有两种常用的引入方式:classpath和file,具体查看如下的例子:
classpath路径:locations={"classpath:application-bean1.xml","classpath:application-bean.xml"}
file路径:locations= {"file:d:/test/application-bean1.xml"};
如下:
@Configuration
@ImportResource({"classpath:application-bean.xml"})
public class ShiroConfig{
}
2、重点说一下@Import
springboot提供了三种Import的方式:
1、@Import注解导入
2、实现ImportSelector接口
3、实现ImportBeanDefinitionRegistrar接口
首先定义三个普通java类User.java 、Role.java、Person.java,一个配置类ImportConfig.java
public class User {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Role {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class ImportConfig {
//配置Person的bean
@Bean
public Person person(){
return new Person();
}
}
直接注入@Import注解
注解导入User、Role、ImportConfig,如下
@SpringBootApplication
@Import(value={User.class,Role.class,ImportConfig.class})
public class ImportApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(ImportApplication.class, args);
System.out.println(context.getBean(User.class));
System.out.println(context.getBean(Role.class));
System.out.println(context.getBean(Person.class));
System.out.println("=================================");
context.close();
}
}
结果打印如下:
com.sjz.lesson2.config.User@c20be82
com.sjz.lesson2.config.Role@13c612bd
com.sjz.lesson2.config.Person@3ef41c66
=================================
发现注入成功
实现ImportSelector
1、实现ImportSelector接口:
public class MyImportSelector implements ImportSelector{
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{User.class.getName(),Role.class.getName(),ImportConfig.class.getName()};
}
}
2、定义注解ImportSelectorAnnotation,导入MyImportSelector类
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(value=MyImportSelector.class)
public @interface ImportSelectorAnnotation {
}
3、java类中使用ImportSelectorAnnotation注解
@ImportSelectorAnnotation //等价于@Import(value=MyImportSelector.class)
@SpringBootApplication
//@Import(value={User.class,Role.class,ImportConfig.class})
//@Import(value=MyImportSelector.class)//等价于@Import(value={User.class,Role.class,ImportConfig.class})
@ImportSelectorAnnotation //等价于@Import(value=MyImportSelector.class)
public class ImportApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(ImportApplication.class, args);
System.out.println(context.getBean(User.class));
System.out.println(context.getBean(Role.class));
System.out.println(context.getBean(Person.class));
System.out.println("=================================");
context.close();
}
}
测试可以正常获取
实现ImportBeanDefinitionRegistrar接口
1、实现ImportBeanDefinitionRegistrar接口
public class MyBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar{
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
BeanDefinitionBuilder userBeanDefinition = BeanDefinitionBuilder.rootBeanDefinition(User.class);
registry.registerBeanDefinition(User.class.getName(), userBeanDefinition.getBeanDefinition());
BeanDefinitionBuilder roleBeanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Role.class);
registry.registerBeanDefinition(Role.class.getName(), roleBeanDefinition.getBeanDefinition());
BeanDefinitionBuilder importConfigBeanDefinition = BeanDefinitionBuilder.rootBeanDefinition(ImportConfig.class);
registry.registerBeanDefinition(ImportConfig.class.getName(), importConfigBeanDefinition.getBeanDefinition());
}
}
2、定义注解BeanDefinitionRegistrarAnnotation导入MyBeanDefinitionRegistrar
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(value=MyBeanDefinitionRegistrar.class)
public @interface BeanDefinitionRegistrarAnnotation {
}
3、java类中使用BeanDefinitionRegistrarAnnotation注解
@SpringBootApplication
@BeanDefinitionRegistrarAnnotation
public class ImportApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(ImportApplication.class, args);
System.out.println(context.getBean(User.class));
System.out.println(context.getBean(Role.class));
System.out.println(context.getBean(Person.class));
System.out.println("=================================");
context.close();
}
}
备注:可以在具体类中直接使用@Import注解导入MyImportSelector和MyBeanDefinitionRegistrar,不需要使用注解