@Import注解

  1. @Import(要导入到容器中的组件);容器中就会自动注册这个组件,id默认是全类名
  2. ImportSelector:返回需要导入的组件的全类名数组;
  3. ImportBeanDefinitionRegistrar:手动注册bean到容器中

 

@Import只能用在类上 ,@Import通过快速导入的方式实现把实例加入spring的IOC容器中

对应的import的bean都将加入到spring容器中,这些在容器中bean名称是该类的全类名 

@Import注解_第1张图片

这是我们的实体类,但是我们并没有注入到容器中。

@Import例子:

package cn.tx.sboot.config;

import cn.tx.sboot.Bean.Person;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@Import({Person.class,MyImportSelecttor.class,MyImportBeanDefinitionRegistrar.class})
public class appConfig {

}

 测试类:

package cn.tx.sboot.controller;

import cn.tx.sboot.config.appConfig;
import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class ImportConfigTest {
    AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(appConfig.class);
    /**
     * 遍历匹配的组件名称
     * @param annotationConfigApplicationContext 注解上下文
     */
    private void printClassName(AnnotationConfigApplicationContext annotationConfigApplicationContext){
        String[] beanDefinitionNames = annotationConfigApplicationContext.getBeanDefinitionNames();
        for (int i = 0; i < beanDefinitionNames.length; i++) {
            System.out.println("匹配的类"+beanDefinitionNames[i]);
        }
    }
    @Test
    public void testImport(){
        printClassName(annotationConfigApplicationContext);
    }

}

ImportSelector例子:这种方式的前提就是一个类要实现ImportSelector接口

package cn.tx.sboot.config;

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

public class MyImportSelecttor implements ImportSelector { /**
 *
 * @param annotationMetadata 加@Import注解的类,所有注解信息
 * @return
 */

    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        return new String[]{"cn.tx.sboot.Bean.Cat"};
    }
}

 返回值分析:

  • 1、返回值: 就是我们实际上要导入到容器中的组件全类名【重点 】
  • 2、参数: AnnotationMetadata表示当前被@Import注解给标注的所有注解信息【不是重点】

 测试类都是用的一个。

ImportBeanDefinitionRegistrar例子:

 

package cn.tx.sboot.config;

import org.springframework.beans.factory.config.BeanDefinition;
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 MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    /**
     * 注册bean
     * @param importingClassMetadata 当前类的信息
     * @param registry Bean注册器
     */
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        /**
         * BeanDefinition可以设置组件的多个信息
         * 例如:
         * setBeanClassName 设置bean的全类名
         * setScope 设置bean的作用域
         */
        BeanDefinition beanDefinition =new RootBeanDefinition();
        beanDefinition.setBeanClassName("cn.tx.sboot.Bean.Dog");
        beanDefinition.setScope(BeanDefinition.SCOPE_PROTOTYPE);
        //判断容器中是否注册Cat对象,如果有则注册Dog
        if(registry.containsBeanDefinition("cn.tx.sboot.Bean.Cat")){
            //beanName为在容器中的id
            registry.registerBeanDefinition("Dog",beanDefinition);
        }
    }
}

结果:

@Import注解_第2张图片

你可能感兴趣的:(SSM,spring,spring,boot)