当前位置: 代码迷 >> 综合 >> spring注解@Import、ImportSelector、ImportBeanDefinitionRegistrar向IOC容器中导入组建
  详细解决方案

spring注解@Import、ImportSelector、ImportBeanDefinitionRegistrar向IOC容器中导入组建

热度:41   发布时间:2023-10-26 08:31:18.0
* 在容器中注册组建*      1:包扫描:带用注解的组建(@Controller、@Service、@Repotitory...)*      2:bean注解导入组建【导入第三方包里的组建】*      3:@Import快速向容器中导入组建*          1.@Import(需要导入的组建);容器中会自动注册组建,默认id是全类名*          2.ImportSelector返回需要导入的组建全类名数组,不可以自定义组建id,全类名*          3.ImportBeanDefinitionRegistrar:手动注册bean到容器中,可以自定义组建的id*      4:自己定义一个类实现FactoryBean接口,实现其方法,指定要注册到容器中的bean

下面是ImportSelector的用法:

在@Import注解中加入实现了Selector接口的类

具体的解释和注意事项写在了代码中

/*** @Import注解导入的组建id默认是全类名*/
@Import(value = {Color.class,Red.class,MyImportSeletor.class,MyImportBeanDefinitionRegistrar.class})
@Configuration
//将conditional注解放在类上,若不满足条件,则类中所有的bean都不会被注册到IOC容器中
//@Conditional({WindowCondition.class})
public class MainConfig2 {//这种方法将ImportSelector类注入到容器中是行不通的,它返回的数组中的类并不会被注册到容器中/*@Beanpublic MyImportSeletor seletor(){return new MyImportSeletor();}*/
MyImportSeletor.class
package com.annotation.ImportSeletor;import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;import java.util.Set;//实现spring的ImportSelector接口,重写selectImports方法,方法的返回值是一个String数组,数组中包含的全类名会被注册到容器中
//容器中最终注册的组建是返回的全类名,而当前的MyImportSeletor不会被导入到容器中
public class MyImportSeletor implements ImportSelector {//AnnotationMetadata:当前标注了@Import注解的类的所有注解信息@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {//获取当前标注了@Import的类的所有注全类名Set<String> annotationTypes = importingClassMetadata.getAnnotationTypes();for (String annotationType : annotationTypes) {System.out.println(annotationType);}String[] strs = {"com.annotation.entities.Blue","com.annotation.entities.Yellow"};//这里可以返回一个空数组,但是不要返回null,否则在spring底层会获取数组的长度,返回null程序会报空指针异常return strs;}
}

下面是ImportBeanDefinitionRegistrar的用法:

当容器中包含Yellow和Red时,向容器中注册RainBox组建

MyImportBeanDefinitionRegistrar.class
package com.annotation.importannotation;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 {/*** AnnotationMetadata:当前Import注解所在类的注解信息* BeanDefinitionRegistry*/@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {System.out.println("当前容器中定义的bean的数量" + registry.getBeanDefinitionCount());System.out.println("根据beanName获取容器中的bean" + registry.getBeanDefinition("person"));System.out.println("获取容器中所有定义的bean的名字" + registry.getBeanDefinitionNames());System.out.println("判断容器中是否有Blue的定义" + registry.containsBeanDefinition("com.annotation.entities.Blue"));boolean b = registry.containsBeanDefinition("com.annotation.entities.Yellow");boolean b1 = registry.containsBeanDefinition("com.annotation.entities.Red");if (b && b1){BeanDefinition beanDefinition = new RootBeanDefinition("com.annotation.entities.RainBow");registry.registerBeanDefinition("rainBow",beanDefinition);}}
}

 

  相关解决方案