@Import注解

tech2022-10-01  119

@Import(要导入到容器中的组件);容器中就会自动注册这个组件,id默认是全类名ImportSelector:返回需要导入的组件的全类名数组;ImportBeanDefinitionRegistrar:手动注册bean到容器中

 

@Import只能用在类上 ,@Import通过快速导入的方式实现把实例加入spring的IOC容器中

对应的import的bean都将加入到spring容器中,这些在容器中bean名称是该类的全类名 

这是我们的实体类,但是我们并没有注入到容器中。

@Import例子:

package cn.tx.sboot.config; import cn.tx.sboot.Bean.Person; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; @Configuration @Import({Person.class,MyImportSelecttor.class,MyImportBeanDefinitionRegistrar.class}) public class appConfig { }

 测试类:

package cn.tx.sboot.controller; import cn.tx.sboot.config.appConfig; import org.junit.jupiter.api.Test; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class ImportConfigTest { AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(appConfig.class); /** * 遍历匹配的组件名称 * @param annotationConfigApplicationContext 注解上下文 */ private void printClassName(AnnotationConfigApplicationContext annotationConfigApplicationContext){ String[] beanDefinitionNames = annotationConfigApplicationContext.getBeanDefinitionNames(); for (int i = 0; i < beanDefinitionNames.length; i++) { System.out.println("匹配的类"+beanDefinitionNames[i]); } } @Test public void testImport(){ printClassName(annotationConfigApplicationContext); } }

ImportSelector例子:这种方式的前提就是一个类要实现ImportSelector接口

package cn.tx.sboot.config; import org.springframework.context.annotation.ImportSelector; import org.springframework.core.type.AnnotationMetadata; public class MyImportSelecttor implements ImportSelector { /** * * @param annotationMetadata 加@Import注解的类,所有注解信息 * @return */ @Override public String[] selectImports(AnnotationMetadata annotationMetadata) { return new String[]{"cn.tx.sboot.Bean.Cat"}; } }

 返回值分析:

1、返回值: 就是我们实际上要导入到容器中的组件全类名【重点 】2、参数: AnnotationMetadata表示当前被@Import注解给标注的所有注解信息【不是重点】

 测试类都是用的一个。

ImportBeanDefinitionRegistrar例子:

 

package cn.tx.sboot.config; import org.springframework.beans.factory.config.BeanDefinition; 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 MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar { /** * 注册bean * @param importingClassMetadata 当前类的信息 * @param registry Bean注册器 */ public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { /** * BeanDefinition可以设置组件的多个信息 * 例如: * setBeanClassName 设置bean的全类名 * setScope 设置bean的作用域 */ BeanDefinition beanDefinition =new RootBeanDefinition(); beanDefinition.setBeanClassName("cn.tx.sboot.Bean.Dog"); beanDefinition.setScope(BeanDefinition.SCOPE_PROTOTYPE); //判断容器中是否注册Cat对象,如果有则注册Dog if(registry.containsBeanDefinition("cn.tx.sboot.Bean.Cat")){ //beanName为在容器中的id registry.registerBeanDefinition("Dog",beanDefinition); } } }

结果:

最新回复(0)