ImportBeanDefinitionRegistrar接口的实现类只能通过@Import方式加载,通常是启动类或者配置类。使用@Import,如果括号的类包含
ImportBeanDefinitionRegistrar实现类,则会调用接口的方法,使用BeanDefinitionRegistry注册bean。
1、pom.xml文件
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.6.RELEASE</version> </dependency>
2、实体类
import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class Student { // 唯一标识 private int id; // 年龄 private int age; // 姓名 private String name; }
import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor public class Person { private int id; private int age; private String name; }
3、ImportBeanDefinitionRegistrar接口实现类
import com.it.vo.Student; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; import org.springframework.core.type.AnnotationMetadata; public class JamesImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar { @Override public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) { boolean flag = beanDefinitionRegistry.containsBeanDefinition("com.it.vo.Person"); if (flag) { // 如果IOC容器存在Person,那么手动将Student类加入到IOC容器中。 RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Student.class); beanDefinitionRegistry.registerBeanDefinition("student", rootBeanDefinition); } } }
4、配置类
import com.it.service.impl.JamesImportBeanDefinitionRegistrar; import com.it.vo.Person; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; @Configuration @Import(value = {Person.class, JamesImportBeanDefinitionRegistrar.class}) public class PersonConfig { }
5、测试类
import com.it.config.PersonConfig; import com.it.vo.Person; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class PersonTest { public static void main(String [] args) { ApplicationContext applicationContext = new AnnotationConfigApplicationContext(PersonConfig.class); Person person = applicationContext.getBean(Person.class); Object student = applicationContext.getBean("student"); System.out.println(person); System.out.println(student); } }
//结果:
Person(id=0, age=0, name=null) Student(id=0, age=0, name=null)