好像已经有很多相关的文章了,不过我写了就顺手发一下
主要是通过重写其方法实现动态加载bean
通过实现ImportBeanDefinitionRegistrar接口重写registerBeanDefinitions方法,首先创建以BeanDefinition的实现类GenericBeanDefinition,设置beanClassName,用BeanDefinitionRegistry将其注册。spring容器启动后将实现ImportBeanDefinitionRegistrar的类注入到ioc之后也会把其注册的类同样注入到ioc容器中,如图
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.GenericBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;
public class TestImportBeanDefinitionRegistary implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
BeanDefinition beanDefinition = new GenericBeanDefinition();
beanDefinition.setBeanClassName(TestService.class.getName());
registry.registerBeanDefinition("testService", beanDefinition);
}
}
一个测试类
public class TestService {
}
另外可以自定义声明一个注解使用@Import,将TestImportBeanDefinitionRegistary引入
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(TestImportBeanDefinitionRegistary.class)
public @interface EnableDemoRegistraray {
}
最后测试一下
@EnableDemoRegistraray
@SpringBootApplication
public class SpringCloudUserServiceApplication {
public static void main(String[] args) {
ConfigurableApplicationContext contxt = SpringApplication.run(SpringCloudUserServiceApplication.class, args);
System.out.println(contxt.getBean(TestService.class));
}
}
可以看到这个测试类已经通过改注解注入到IOC容器中了
以上