SpringBoot原理篇:bean的多种加载方法之 实现ImportSelector类动态加载bean

实现ImportSelector类→ 动态加载bean → 源码中大量使用

代码

package com.qing.config;

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

import java.util.Map;

public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata metadata) {
        //metadata元数据 : 指的是加载本类MyImportSelector的类
        //metadata的get、has、is 有大量方法,可以用来获取判断数据
        Map<String, Object> annotationAttributes = metadata.getAnnotationAttributes("org.springframework.context.annotation.ComponentScan");
        System.out.println("注解"+annotationAttributes);

        boolean hasConfiguration = metadata.hasAnnotation("org.springframework.context.annotation.Configuration");
        if(hasConfiguration){
            return new String[]{"com.qing.bean.cat"};
        }

        return new String[]{"com.qing.bean.dog"};
    }
}

 元数据metadata指的是下面的config6

package com.qing.config;


import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

//@Configuration 注解是测试用的
@Configuration
//@ComponentScan 注解是测试用的
@ComponentScan("com.qing.bean")
@Import(MyImportSelector.class)
public class SpringConfig6 {

}

测试

package com.qing.app;

import com.qing.config.SpringConfig6;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;


public class App6 {
    public static void main(String[] args) {

        ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig6.class);
        String[] names = ctx.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println("bean的名字:" + name);
        }

    }
}

 结果

因为元数据上有@Configuration注解,所以返回的是cat

元数据上没有@Configuration注解了,所以返回的是dog

 总结

猜你喜欢

转载自blog.csdn.net/m0_45877477/article/details/125662070