SpringBoot 高级 原理分析 -- @Import注解

01: SpringBoot 高级 原理分析 – SpringBoot 自动配置:Condition
02: SpringBoot 高级 原理分析 – 切换内置web服务器
03: SpringBoot 高级 原理分析 – @Enable*注解、@Import注解
04: SpringBoot 高级 原理分析 – @Import注解
05: SpringBoot 高级 原理分析 – @EnableAutoConfiguration 注解
06: SpringBoot 高级 原理分析 – 自定义redis-starter

1. @Import注解

@Enable*底层依赖于@Import注解导入一些类,使用@Import导入的类会被Spring加载到IOC容器中。而@Import提供4中用法:

  • ① 导入Bean(直接导入相关的Bean)
  • ② 导入配置类(会把配置类里面所有定义的Bean都注入到IOC容器里面)
  • ③ 导入 ImportSelector 实现类。一般用于加载配置文件中的类
  • ④ 导入 ImportBeanDefinitionRegistrar 实现类。

说明:本节案例承接上节案例


1.1 导入Bean(直接导入相关的Bean)

在这里插入图片描述


1.2 导入配置类

准备工作:

  1. 新增一个Role类
    在这里插入图片描述
package com.tian.pojo;

public class Role {
}
  1. 配置UserConfig

在这里插入图片描述

package com.tian.config;


import com.tian.pojo.Role;
import com.tian.pojo.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class UserConfig {

    @Bean
    public User user(){
        return new User();
    }

    @Bean
    public Role role(){
        return new Role();
    }
}

开始测试:

在这里插入图片描述


1.3 导入 ImportSelector 实现类

在这里插入图片描述

package com.tian.config;

import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;

public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        // 这个里面对应实体类的全限定类名
        // 使用这种方式的好处是可以灵活配置(可以在配置文件当中获取文件的全限定类名)
        return new String[]{"com.tian.pojo.Role", "com.tian.pojo.User"};
    }
}

开始测试:

在这里插入图片描述


1.4 导入 ImportBeanDefinitionRegistrar 实现类

在这里插入图片描述

package com.tian.config;

import com.tian.pojo.Role;
import com.tian.pojo.User;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        AbstractBeanDefinition beanDefinition01 = BeanDefinitionBuilder.rootBeanDefinition(User.class).getBeanDefinition();
        AbstractBeanDefinition beanDefinition02 = BeanDefinitionBuilder.rootBeanDefinition(Role.class).getBeanDefinition();
        registry.registerBeanDefinition("user", beanDefinition01);
        registry.registerBeanDefinition("role", beanDefinition02);
    }
}

运行结果:

在这里插入图片描述



评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeJiao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值