spring注解驱动开发-组件注册-@Import给容器快速导入组件

1.Import

我们之前有使用过@Bean注册过,也有使用过包扫描+组件标注注解(@Controller/@Service/@Repository/@Component)的方式,接下来咱们使用@Import的方式

首先我们建一个Color颜色类

public class Color {
}

再建一个导入组件的配置测试类

@Configuration
// 导入组件,id默认是组件的全类名
@Import(Color.class)
// @Import({Color.class,Red.class}) 此方式可以实现多个组件注册
public class ImportZJTest {
}

建一个测试类来开启容器,并获取容器中的color的bean对象,可以main方法也可以test环境,我这里用junit的test的方式测试了,

package springannotion.conditional;

import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import springanntition.beanFactory.BeanTest;
import springanntition.zjimport.ImportZJTest;
import springorgin.demo.configbean.Bule;
import springorgin.demo.configbean.Color;

public class ImportTest {
    AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ImportZJTest.class);

    @Test
    public void iocTest() {
        printBeans(applicationContext);
        // 获取color类
        Object bean = applicationContext.getBean(Color.class);
    }
    
    // 注入容器的bean打印
    private void printBeans(AnnotationConfigApplicationContext applicationContext) {
        String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
        for (String name : beanDefinitionNames) {
            System.out.println(name);
        }
    }
}

运行一下看看,配置类肯定是注册进来了,我们也获取到bean里的color对象了。

2.ImportSelector

也可以使用ImportSelector自定义逻辑导入组件

首先创建MyImportSelector并需要实现ImportSelector类接口,并实现selectImports方法

package springanntition.zjimport;

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

// 自定义逻辑返回需要导入的组件
public class MyImportSelector implements ImportSelector  {

    // AnnotationMetadata:当前标注@Import注解类的所有注释信息
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        // importingClassMetadata参数可以获取到要注入容器的信息
        // 返回值,就是导入到容器中的组件全类名
        return new String[]{"springorgin.demo.configbean.Bule"};
    }
}

创建blue颜色类 

​
public class Bule {
}

然后在配置里使用@Import(MyImportSelector.class)

package springanntition.zjimport;

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import springorgin.demo.configbean.Color;

@Configuration
// 导入组件,id默认是组件的全类名
@Import({MyImportSelector.class})
public class ImportZJTest {
}

在测试里写下从容器获取对应的注册对象

package springannotion.conditional;

import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import springanntition.beanFactory.BeanTest;
import springanntition.zjimport.ImportZJTest;
import springorgin.demo.configbean.Bule;

public class ImportTest {
    AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ImportZJTest.class);

    @Test
    public void iocTest() {
        printBeans(applicationContext);
        Object bean = applicationContext.getBean(Bule.class);
        System.out.println("从容器中获取数据:" + bean);
    }

    private void printBeans(AnnotationConfigApplicationContext applicationContext) {
        String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
        for (String name : beanDefinitionNames) {
            System.out.println(name);
        }
    }
}

运行下

3.ImportBeanDefinitionRegistrar

这种方式通过创建MyImportBeanDefinitionRegistrar类接口实现ImportBeanDefinitionRegistrar并实现registerBeanDefinitions方法通过registry.registerBeanDefinition()注册组件的,咱们来实现一下

在创建一个颜色类,叫彩虹类

package springorgin.demo.configbean;

public class RainBow {
}

创建MyImportBeanDefinitionRegistrar类实现注册逻辑

package springanntition.zjimport;

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 springorgin.demo.configbean.RainBow;

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

    /*
     AnnotationMetadata:当前类的注释信息
     BeanDefinitionRegistry:调用registry.registerBeanDefinition()手工注册进来
     * */
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
      // 获取容器中是否有这个blue对象的bean
        boolean definition = registry.containsBeanDefinition("springorgin.demo.configbean.Bule");
        // 获取容器中是否有这个color对象的bean
        boolean definition1 = registry.containsBeanDefinition("springorgin.demo.configbean.Color");
        // 如果容器中有Bule和Color就注册rainBow
        if (definition && definition1) {
            // 指定bean的定义信息:(Bean的类型,Bean的作用域。。。)
            RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(RainBow.class);
            // 注册一个bean,可以指定bean名称
            registry.registerBeanDefinition("rainBow", rootBeanDefinition);
        }
    }
}

配置类配置

package springanntition.zjimport;

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import springorgin.demo.configbean.Color;

@Configuration
// 导入组件,id默认是组件的全类名
@Import({Color.class, Bule.class, MyImportBeanDefinitionRegistrar.class})
public class ImportZJTest {
}

测试类

package springannotion.conditional;

import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import springanntition.beanFactory.BeanTest;
import springanntition.zjimport.ImportZJTest;
import springorgin.demo.configbean.Bule;
import springorgin.demo.configbean.RainBow;

public class ImportTest {
    AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ImportZJTest.class);

    @Test
    public void iocTest() {
        // 此测试即可测试import也可测试importSelector,ImportBeanDefinitionRegistrar
        printBeans(applicationContext);
        Object bean = applicationContext.getBean(RainBow.class);
        System.out.println("从容器中获取数据:" + bean);
    }

    private void printBeans(AnnotationConfigApplicationContext applicationContext) {
        String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
        for (String name : beanDefinitionNames) {
            System.out.println(name);
        }
    }
}

运行一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值