ImportBeanDefinitionRegistrar怎么注入Bean

Posted 醉酒的小男人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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();
    }
}

以上是关于ImportBeanDefinitionRegistrar怎么注入Bean的主要内容,如果未能解决你的问题,请参考以下文章