`

@ImportResouce和@@Import在springboot中的使用

阅读更多

@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,不需要使用注解

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics