【spring系列】之3:Import快速给容器中添加组件

本文深入探讨了在Spring框架中注册Bean的多种方法,包括包扫描、条件注入、使用@Import注解、FactoryBean注册等。特别介绍了@Import注解的三种使用方式,即直接引入bean、实现ImportSelector接口和ImportBeanDefinitionRegistrar接口来灵活注册bean。
摘要由CSDN通过智能技术生成

给容器注册bean的几种方式:

1.包扫描:ComponentScan+bean注解(@Controller,@Service,@Repository,@Component,Bean):

2.条件注入:@Conditional按条件选择注入

3.@Import快速给容器中导入一个组件

4.FactoryBean注册

 

@Import提供三种方式注册bean到容器中,

  1. Import直接引入bean
  2. 实现ImportSelector接口注册bean
  3. 实现ImportBeanDefinitionRegistrar接口注册bean

 

@Import注解源码查看

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {

	/**
	 * {@link Configuration}, {@link ImportSelector}, {@link ImportBeanDefinitionRegistrar}
	 * or regular component classes to import.
	 */
	Class<?>[] value();

}

唯一的参数为Class,因此,为我们提供了多种灵活的注册方式。

1.Import直接引入bean

@Configuration
@Import({ Car.class })
public class ImportConfig {

}

直接引入Car,便将Car注册到了容器中,

根据打印出的bean列表,可以看出,@Import注册的bean在容器的名称为该类的全路径限定名,引用的时候需要用全路径限定名引用。

 

2.实现ImportSelector接口注册bean

先上实现类

public class MyImportSelector implements ImportSelector {

	@Override
	public String[] selectImports(AnnotationMetadata importingClassMetadata) {

		return new String[] { "com.ddc.fw.spring.annotation.demo.importplug.Blue" };
	}

}
@Configuration
@Import({ MyImportSelector.class, MyImportBeanDefinitionRegistrar.class })
public class ImportConfig {

}

通过@Import  MyImportSelector 实现bean注册

注意:在MyImportSelector 返回的数组中,用全路径限定名。

 

3.实现ImportBeanDefinitionRegistrar接口注册bean

首先实现ImportBeanDefinitionRegistrar接口,

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

	@Override
	public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
		boolean flag = registry.containsBeanDefinition("com.ddc.fw.spring.annotation.demo.importplug.Blue");
		if (flag) {
			BeanDefinition beanDefinition = new RootBeanDefinition(Yellow.class);
			registry.registerBeanDefinition("yellow", beanDefinition);
		}

	}

}

通过代码可知,ImportBeanDefinitionRegistrar注册的bean的名称,可以自定义id/name名称,比起ImportSelector的全路径类名简单些。同时可以通过BeanDefinitionRegistry做一些其他的判断,更灵活。

 

@Configuration
@Import({ MyImportSelector.class, MyImportBeanDefinitionRegistrar.class })
public class ImportConfig {

}

@Import注册bean,是springboot的实现原理,了解了@Import,可以更好的了解springboot的源码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值