We saw in the previous tutorials that in addition to ordinary Configuration classes, @Import annotation can also process ImportSelector and DeferredImportSelector implementations. In this tutorial we are going to see one more option for @Import: ImportBeanDefinitionRegistrar.
The interface ImportBeanDefinitionRegistrar
This Interface is to be implemented by types that register additional bean definitions when processing @Configuration classes.
Definition of ImportBeanDefinitionRegistrar(Version: spring-framework 6.2.12) package org.springframework.context.annotation;
........
public interface ImportBeanDefinitionRegistrar {
default void registerBeanDefinitions(
AnnotationMetadata importingClassMetadata,
BeanDefinitionRegistry registry,
BeanNameGenerator importBeanNameGenerator) {
registerBeanDefinitions(importingClassMetadata, registry);
} 1
default void registerBeanDefinitions(
AnnotationMetadata importingClassMetadata,
BeanDefinitionRegistry registry) {} 2
}
Example:
Implementing ImportBeanDefinitionRegistrar
package com.logicbig.example;
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 MyBeanRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,
BeanDefinitionRegistry registry) {
//there can be some conditional criteria to add the following bean
GenericBeanDefinition gbd = new GenericBeanDefinition();
gbd.setBeanClass(AppBean.class);
gbd.getPropertyValues().addPropertyValue("str", "value set from registrar");
registry.registerBeanDefinition("appBean", gbd);
}
}
The configuration class and @Import
package com.logicbig.example;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@Import(MyBeanRegistrar.class)
public class MyConfig {
@Bean
ClientBean clientBean() {
return new ClientBean();
}
}
The beans
package com.logicbig.example;
import org.springframework.beans.factory.annotation.Autowired;
public class ClientBean {
@Autowired
private AppBean appBean;
public void doSomething() {
appBean.process();
}
}
package com.logicbig.example;
public class AppBean {
private String str;
public void setStr(String str) {
this.str = str;
}
public void process() {
System.out.println(str);
}
}
The main method
package com.logicbig.example;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class ImportBeanDefinitionRegistrarExample {
public static void main(String[] args) {
ApplicationContext context =
new AnnotationConfigApplicationContext(
MyConfig.class);
ClientBean bean = context.getBean(ClientBean.class);
bean.doSomething();
}
}
Outputvalue set from registrar
Example ProjectDependencies and Technologies Used: - spring-context 6.2.12 (Spring Context)
Version Compatibility: 3.2.3.RELEASE - 6.2.12 Version compatibilities of spring-context with this example: Versions in green have been tested.
- JDK 25
- Maven 3.9.11
|