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);
}
}
}
运行一下