【Spring注解】@Import

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nrsc272420199/article/details/88560271

源码:https://github.com/nieandsun/spring-study

1.简介

@Import注解是一个平常我们很少用,但很多框架源码里经常出现的注解,使用该注解可以向spring容器中注册bean实例.

2.@Import注解的value类型

在这里插入图片描述

3. Demo

代码结构

在这里插入图片描述

3.1 普通类.class

  • 配置类
@Configuration
/**将Dog和Cat类注入到Spring容器*/
@Import(value = {Dog.class, Cat.class}) 
public class ImportStudyConfig1 {
}
  • 运行结果

在这里插入图片描述

3.2 继承了ImportBeanDefinitionRegistrar接口的类.class

  • 继承了ImportSelector接口的类
package com.nrsc.springstudy.c2_import.config;
import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;
public class NrscImportSelector implements ImportSelector {
    /**
     * 该类需要实现的方法就一个
     * @param importingClassMetadata
     * @return
     */
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        //返回要注入到spring容器的全类名
        return new String[]{
                "com.nrsc.springstudy.c2_import.bean.Duck",
                "com.nrsc.springstudy.c2_import.bean.Elephant"};
    }
}
  • 配置类
@Configuration
@Import(value = {Dog.class, Cat.class,NrscImportSelector.class})
public class ImportStudyConfig2 {
}
  • 运行结果

在这里插入图片描述

3.3 继承了ImportBeanDefinitionRegistrar接口的类.class

  • 继承了ImportBeanDefinitionRegistrar接口的类
package com.nrsc.springstudy.c2_import.config;

import com.nrsc.springstudy.c2_import.bean.Pig;
import com.nrsc.springstudy.c2_import.bean.Sheep;
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;

public class NrscImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    /**
     * 该类需要实现的方法就一个
     * @param importingClassMetadata 当前类的注解信息
     * @param registry 可以把要加入到Spring容器中的类加入进去
     */
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        //查看Elephant类是否被定义---也可以理解为查看Elephant是否注册到spring容器中
        boolean bean1 = registry.containsBeanDefinition("com.nrsc.springstudy.c2_import.bean.Elephant");
        boolean bean2 = registry.containsBeanDefinition("com.nrsc.springstudy.c2_import.bean.Rabbit");

        //如果Elephant注册了,则注册Pig类到Sping容器------>pig应该可以被注册到spring容器
        if(bean1){
            RootBeanDefinition beanDefinition = new RootBeanDefinition(Pig.class);
          	//可以自己指定注入到Spring容器中的key值为pig
            registry.registerBeanDefinition("pig", beanDefinition);
        }

        //如果Rabbit注册了,则注册Sheep类到Sping容器------>Sheep应该可以被注册到spring容器
        if(bean2){
            RootBeanDefinition beanDefinition = new RootBeanDefinition(Sheep.class);
            registry.registerBeanDefinition("sheep", beanDefinition);
        }
    }
}
  • 配置类
@Configuration
@Import(value = {Dog.class, Cat.class, NrscImportSelector.class, NrscImportBeanDefinitionRegistrar.class})
public class ImportStudyConfig3 {
}
  • 运行结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/nrsc272420199/article/details/88560271