美文网首页
spring注入bean的三种方式

spring注入bean的三种方式

作者: bluestar_f4e2 | 来源:发表于2019-12-30 15:16 被阅读0次

1 @Import(要导入到容器中的组件);容器中就会自动注册这个组件,id默认是全类名

示例代码


/**
 * 被直接import的bean
 */
public class DirectImport{

}

/**
 * 测试代码
 */
@Import({DirectImport.class})
@Configuration
public class DirectImportTest {
    public static void main(String[] args){
        ApplicationContext ac=new AnnotationConfigApplicationContext(DirectImportTest.class);
        System.out.println(ac.getBean(DirectImport.class));
    }
}

2 ImportSelector:返回需要导入的组件的全类名数组,在此通过另外一个注解EnableImportSelector 间接导入

示例代码


/**
 * 通过BeanImportSelector 导入的bean
 */
public class ImportSel {
}

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Import(BeanImportSelector.class)
public @interface EnableImportSelector {
}

/**
 * 测试代码
 */
@EnableImportSelector
@Configuration
public class DirectImportTest {
    public static void main(String[] args){
        ApplicationContext ac=new AnnotationConfigApplicationContext(DirectImportTest.class);
        System.out.println(ac.getBean(ImportSel.class));
    }
}

3.ImportBeanDefinitionRegistrar:手动注册bean到容器中

示例代码


/**
 * 通过ImportBeanDefinitionRegistrar导入的bean
 */
public class ImportBeanDefinition {
    private String name;

    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "ImportBeanDefinition{" +
                "name='" + name + '\'' +
                '}';
    }
}

/**
 * 通过此方式,手动初始化BeanDefinition,可以设置bean属性
 */
public class ImportBeanDefinitionRegistrarImport implements ImportBeanDefinitionRegistrar{
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        BeanDefinitionBuilder definition = BeanDefinitionBuilder
                .genericBeanDefinition(ImportBeanDefinition.class);
        definition.addPropertyValue("name","i am ok");
        registry.registerBeanDefinition(ImportBeanDefinition.class.getName(),definition.getBeanDefinition());
    }
}

/**
 * 测试代码
 */
@Configuration
@Import(ImportBeanDefinitionRegistrarImport.class)
public class DirectImportTest {
    public static void main(String[] args){
        ApplicationContext ac=new AnnotationConfigApplicationContext(DirectImportTest.class);
        System.out.println(ac.getBean(ImportBeanDefinition.class));
    }
}

相关文章

网友评论

      本文标题:spring注入bean的三种方式

      本文链接:https://www.haomeiwen.com/subject/rdqmoctx.html