spring @Import的使用

1、配置一个spring配置文件

package com.zdc.sp.config;

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

import com.zdc.sp.impot.MyImportBeanDefinitionRegister;
import com.zdc.sp.impot.MyImportSelect;
import com.zdc.sp.model.Color;
import com.zdc.sp.model.Red;
import com.zdc.sp.model.User;

/**
 * @import [快速给容器中导入一个组件]
 *             1)、@import(要导入到容器中的组件);容器中就会自动注册这个组件,id默认是全类名;
 *             2)、ImportSelector:返回需要导入的组件的全类名数组---------->(MyImportSelect.class)
 *             3)、ImportBeanDefinitionRegistrar:手动注册bean到容器中------------->MyImportBeanDefinitionRegister.class
 * @author lenovo
 *
 */
@Configuration
@Import({Color.class,Red.class,MyImportSelect.class,MyImportBeanDefinitionRegister.class})//将class类导入容器中(id默认是组建的全类名)
public class ImportConfig {

    @Bean("linux")
    public User user(){
        return new User("张三", 24);
    }
    
    @Bean("windows")
    public User user1(){
        return new User("李四", 24);
    }
}
2、ImportSelector --- 》MyImportSelect.class

package com.zdc.sp.impot;

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

//自定义逻辑返回需要导入的组件
public class MyImportSelect implements ImportSelector{
    
    //返回值,就是导入到容器中的组件全类名
    //AnnotationMetadata:当前标注@Import注解的类的所有信息
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        System.out.println("@@@@@@;"+importingClassMetadata.getSuperClassName());
        
        //方法不要返回null,会报空指针异常
        return new String[]{"com.zdc.sp.model.Blue","com.zdc.sp.model.Black"};
    }

}

3、ImportBeanDefinitionRegistrar --- 》MyImportBeanDefinitionRegister.class

package com.zdc.sp.impot;

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;

import com.zdc.sp.model.Yellow;

public class MyImportBeanDefinitionRegister implements ImportBeanDefinitionRegistrar{

    /**
     * AnnotationMetadata 当前类的注解信息
     * BeanDefinitionRegistry:BeanDefinition注册类
     *  把所有需要添加到容器中的bean;可调用BeanDefinitionRegistry.registerBeanDefinition手工注册进来
     */
    @Override
    public void registerBeanDefinitions(
            AnnotationMetadata importingClassMetadata,
            BeanDefinitionRegistry registry) {
        
        //判断是否含有某bean
        boolean definition = registry.containsBeanDefinition("com.zdc.sp.model.Red");
        if (definition) {
            RootBeanDefinition beanDefinition = new RootBeanDefinition(Yellow.class);
            registry.registerBeanDefinition("Yellow", beanDefinition);
        }
        
    }

}
 

猜你喜欢

转载自blog.csdn.net/u014450465/article/details/89343576