Use of @ImportResouce and @@Import in springboot

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

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=326218251&siteId=291194637