使用ImportBeanDefinitionRegistrar将一个自定义类动态注册bean中的案例详解
下文笔者讲述spring中将类注册到Spring容器中的方法分享,如下所示
1.定义一个自定义类
测试类是否在IOC容器中
ImportBeanDefinitionRegistrar简介
ImportBeanDefinitionRegistrar:
他是Spring框架中的一个接口
我们使用这个接口,可以将自己写的代码封装为一个BeanDefinition对象
实现此接口的类都会回调postProcessBeanDefinitionRegistry方法
然后注册到spring容器中
注意事项:
注册bean到spring容器有 @Service @Component等注解方式
还有一种方式就是实现此接口的类
自定义类注册到IOC容器中的方法
实现思路:
通过实现一个ImportBeanDefinitionRegistrar接口的类的方式
达到将类注册到SpringIOC容器中
例:
1.定义一个自定义类
public class UserService {
}
2.自定义ImportBeanDefinitionRegistrar实现类手动注册bean
public class TestImportBeanDefinitionRegistrar
implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,
BeanDefinitionRegistry registry) {
//扫描注解
Map<String, Object> annotationAttributes = importingClassMetadata
.getAnnotationAttributes(ComponentScan.class.getName());
String[] basePackages = (String[]) annotationAttributes.get("basePackages");
//扫描类
ClassPathBeanDefinitionScanner scanner =
new ClassPathBeanDefinitionScanner(registry, false);
TypeFilter userServiceFilter = new AssignableTypeFilter(UserService.class);
scanner.addIncludeFilter(userServiceFilter);
scanner.scan(basePackages);
}
}
定义一个配置类发现一下上面的ImportBeanDefinitionRegistrar实现类
@Configuration
@ComponentScan("com.java265.**")
@Import(TestImportBeanDefinitionRegistrar.class)
public class TestConfiguration {
}
测试类是否在IOC容器中
@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = {TestConfiguration.class})
public class DemoApplicationTest2 {
@Resource
UserService userService;
@Test
public void contextLoads(){
System.out.println(userService.getClass());
}
}
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


