ImportBeanDefinitionRegistrar怎么注入Bean
Posted 醉酒的小男人
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ImportBeanDefinitionRegistrar怎么注入Bean相关的知识,希望对你有一定的参考价值。
简单介绍
- ImportBeanDefinitionRegistrar类只能通过其他类@Import的方式来加载,通常是启动类或配置类。
- 使用@Import如果括号中的类是ImportBeanDefinitionRegistrar的实现类,则会调用接口方法,将其中要注册的类注册成bean。
- 实现该接口的类拥有注册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的主要内容,如果未能解决你的问题,请参考以下文章