ImportBeanDefinitionRegistrar怎么注入Bean

简单介绍

  1. ImportBeanDefinitionRegistrar类只能通过其他类@Import的方式来加载,通常是启动类或配置类。
  2. 使用@Import如果括号中的类是ImportBeanDefinitionRegistrar的实现类,则会调用接口方法,将其中要注册的类注册成bean。
  3. 实现该接口的类拥有注册bean的能力。

注册Bean的步骤

1.手写一个简单的JavaBean
2.手写一个ImportBeanDefinitionRegistrar的实现类
3.手写一个配置类Configuration并且@Import导入ImportBeanDefinitionRegistrar的实现类和@CompontScan包路径
4.测试类进行测试

手写HelloUser最终会注册成Bean

package test01;

public class HelloUser {

    public void say(){
        System.out.println("hello world ImportBeanDefinitionRegister");
    }

}

手写ImportBeanDefinitionRegistrar的实现类

package test01;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.ClassPathBeanDefinitionScanner;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.core.type.filter.AssignableTypeFilter;
import org.springframework.core.type.filter.TypeFilter;
import java.util.Map;

public class HelloUserImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

    /**
     *
     * @param importingClassMetadata 当前类的注解信息
     * @param registry 注册类 registerBeanDefinition()可以注册bean
     */
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        //对注解进行扫描
        Map<String, Object> annotationAttributes = importingClassMetadata.getAnnotationAttributes(ComponentScan.class.getName());
        //获取basePackages的值
        String[] basePackages = (String[])annotationAttributes.get("basePackages");

        //对类进行扫描
        ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(registry,false);
        TypeFilter helloUserFilter = new AssignableTypeFilter(HelloUser.class);
        scanner.addIncludeFilter(helloUserFilter);
        scanner.scan(basePackages);
    }
}

手写HelloUserConfiguration配置类

package test01;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@ComponentScan("test01")
@Import(HelloUserImportBeanDefinitionRegistrar.class)
public class HelloUserConfiguration {
}

测试类

package test01;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class ImportBeanDefinitionRegisterTest {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(HelloUserConfiguration.class);
        HelloUser user = applicationContext.getBean(HelloUser.class);
        user.say();
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

泡^泡

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

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

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

打赏作者

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

抵扣说明:

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

余额充值