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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值