The use of @ImportResouce and @Import in springboot
The @Import annotation can import classes (beans will be managed by the spring container), or you can import configuration classes (all beans in the configuration classes will be managed by the spring container)
The @ImportResouce annotation loads the XML configuration file
1. There are two commonly used import methods for @ImportResouce: classpath and file. For details, see the following examples:
classpath路径:locations={"classpath:application-bean1.xml","classpath:application-bean.xml"}
file路径:locations= {"file:d:/test/application-bean1.xml"};
as follows:
@Configuration
@ImportResource({"classpath:application-bean.xml"})
public class ShiroConfig{
}
2. Focus on @Import
springboot provides three ways to import:
1. @Import annotation import
2. Implement the ImportSelector interface
3. Implement the ImportBeanDefinitionRegistrar interface
First define three common java classes User.java, Role.java, Person.java, and a configuration class 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 {
//Configure the Person's bean
@Bean
public Person person(){
return new Person();
}
}
Directly inject @Import annotation
Annotation imports User, Role, ImportConfig, as follows
@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();
}
}
The result is printed as follows:
com.sjz.lesson2.config.User@c20be82
com.sjz.lesson2.config.Role@13c612bd
com.sjz.lesson2.config.Person@3ef41c66
=================================
Found that the injection was successful
Implement ImportSelector
1. Implement the ImportSelector interface:
public class MyImportSelector implements ImportSelector{
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{User.class.getName(),Role.class.getName(),ImportConfig.class.getName()};
}
}
2. Define the annotation ImportSelectorAnnotation and import the MyImportSelector class
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(value=MyImportSelector.class)
public @interface ImportSelectorAnnotation {
}
3. Use ImportSelectorAnnotation annotation in java class
@ImportSelectorAnnotation //equivalent to @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 //equivalent to @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();
}
}
The test can be obtained normally
Implement the ImportBeanDefinitionRegistrar interface
1. Implement the ImportBeanDefinitionRegistrar interface
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. Define the annotation BeanDefinitionRegistrarAnnotation and import MyBeanDefinitionRegistrar
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(value=MyBeanDefinitionRegistrar.class)
public @interface BeanDefinitionRegistrarAnnotation {
}
3. Use the BeanDefinitionRegistrarAnnotation annotation in the java class
@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();
}
}
Remarks: You can import MyImportSelector and MyBeanDefinitionRegistrar directly using the @Import annotation in a specific class without using annotations