《读spring源码》12实现ImportSelector接口引入多个 类全名然后 引入容器多个bean

在这里插入图片描述
我们可以通过实现ImportSelector接口引入多个 类全名然后 引入容器多个bean 示例如下:

package test;

import com.enjoy.cap6.MainConfig;
import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * FactoryBean 和 BeanFactorty 有什么区别?
 *
 * FactoryBean :可以把我们的JAVA实例通过FactoryBean注入到容器中
 *
 * BeanFactorty:从我们的容器中获取实例化后的bean
 *
 */
public class MainTEwst6 {


    @Test
    public void sss(){
        AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
        String[] beanDefinitionNames = annotationConfigApplicationContext.getBeanDefinitionNames();
        for(String name :beanDefinitionNames){
            System.out.println(name);
        }
    }
}

package com.enjoy.cap6;


import com.enjoy.cap1.Person;
import com.enjoy.cap5.LinCodition;
import com.enjoy.cap5.WinCodition;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@Import(value = {Dog.class,Cat.class,TTTTImportSelector.class})
public class MainConfig {

    /**
     * 1、@Bean   【导入第三方的类或包的组件】,比如Person为第三方的类,需要我们IOC使用时
     * 2、包扫描+组件的标注注解(@ComponentScan:@Controller,@Service,@Repository,@Componet)一般针对自己写的类
     * 3、@Import:【快速给容器导入一个组件】注意@Bean有点简单
     *              1)@Import(要导入到容器中的组件):容器会自动注册这个组件,bean的id为全类名
     *              2)ImportSelector:是一个接口,返回需要导入到容器的组件的全类名数组。
     *
     * 容器启动时初始化person的bean实例
     *
     * @return
     */
    @Bean("person")
    public Person zhangsan(){
        System.out.println("给我们的容器中添加张三");
        return new Person("张三",22);
    }


}

package com.enjoy.cap6;


import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;

public class TTTTImportSelector implements ImportSelector {


    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {

        return new String[]{"com.enjoy.cap6.Fish","com.enjoy.cap6.Tiger"};
    }
}

package test;

import com.enjoy.cap6.MainConfig;
import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * FactoryBean 和 BeanFactorty 有什么区别?
 *
 * FactoryBean :可以把我们的JAVA实例通过FactoryBean注入到容器中
 *
 * BeanFactorty:从我们的容器中获取实例化后的bean
 *
 */
public class MainTEwst6 {


    @Test
    public void sss(){
        AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
        String[] beanDefinitionNames = annotationConfigApplicationContext.getBeanDefinitionNames();
        for(String name :beanDefinitionNames){
            System.out.println(name);
        }
    }
}

测试结果:
在这里插入图片描述

如果返回null的话会报错:

package com.enjoy.cap6;


import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;

public class TTTTImportSelector implements ImportSelector {

    /**
     *
     * @param importingClassMetadata
     * @return
     */
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {

        return null;
    }
}

报错如下:
在这里插入图片描述
我们debug进去看看
在这里插入图片描述
进入了 config解析器

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值