使用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()); } }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。