将Bean注入Spring容器有哪些方法(面试被问到后的总结)

将Bean注入Spring容器有哪些方法

一,通过@ComponentScan扫描@Component标注的类将bean注入spring容器中

二,通过获取@Configuration和@Bean配合将bean注入spring容器

三,通过@Import

3.1 通过@Import注入某个bean

3.1.1 @Import(Test.class)

3.2 通过@Import注入ImportSelector的实现类

3.2.1
public class TestImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{"com.test.importdemo.Test"};
    }
}

3.3 通过@Import注入ImportBeanDefinitionRegistor的实现类

3.3.1
public class TestImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        RootBeanDefinition test = new RootBeanDefinition(Test.class);
        registry.registerBeanDefinition("test", test);
    }
}

四,通过实现BeanDefinitionRegistorPostProcessor接口

4.1
public class Demo {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
        TestBeanDefinitionRegistryPostProcessor beanDefinitionRegistryPostProcessor = new TestBeanDefinitionRegistryPostProcessor();
        applicationContext.addBeanFactoryPostProcessor(beanDefinitionRegistryPostProcessor);
        applicationContext.refresh();
        Test bean = applicationContext.getBean(Test.class);
        System.out.println(bean);
    }
}

class TestBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
 
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Test.class).getBeanDefinition();
        registry.registerBeanDefinition("test", beanDefinition);
    }
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
 
    }
}

五,通过实现FactoryBean接口

5.1
@Configuration
public class Demo {
    @Bean
    public PersonFactoryBean personFactoryBean() {
        return new PersonFactoryBean();
    }
 
    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Demo.class);
        Test bean = applicationContext.getBean(Test.class);
        System.out.println(bean);
    }
}
 
class TestFactoryBean implements FactoryBean<Test> {
 
    /**
     *  直接new出来Test进行返回.
     */
    @Override
    public Test getObject() throws Exception {
        return new Test();
    }
    /**
     *  指定返回bean的类型.
     */
    @Override
    public Class<?> getObjectType() {
        return Test.class;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值