相亲相爱的@Import和@EnableXXX

本文深入探讨了Spring框架中@Import和@EnableXXX注解的使用和原理。通过三个示例详细解释了@Import的三种注册Bean方式,并通过源码分析揭示了@Import注解在Spring启动过程中的处理流程。同时,文章阐述了@Enable系列注解的工作机制,以@EnableAsync为例,展示了如何通过@Import注解实现特定功能的开启。最后,讨论了使用@Import和@Enable注解的好处和灵活性。
摘要由CSDN通过智能技术生成

扫描下方二维码或者微信搜索公众号菜鸟飞呀飞,即可关注微信公众号,阅读更多Spring源码分析文章

微信公众号

1. @Import注解

通过Import注解,我们有三种方式可以向Spring容器中注册Bean。相当于Spring中XML的标签。

1.1 直接注册

  • 例如:@Import(RegularBean.class)。(RegularBean是开发人员自定义的一个类)。代码如下,在代码中通过在AppConfig类上加了一行注解:@Import(RegularBean.class),这样就能从容器中获取到RegularBean的实例对象的。
/**
* 自定义的一个普通类
*/
public class RegularBean {
   
}
/**
* 在配置类上通过Import注解向Spring容器中注册RegularBean
*/
@Configuration
@Import(RegularBean.class)
public class AppConfig {
   
}
public class MainApplication {
   

	public static void main(String[] args) {
   
		// 启动容器
		AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
		// 获取bean
		RegularBean bean = applicationContext.getBean(RegularBean.class);
		// 打印bean
		// 打印结果: com.tiantang.study.components.RegularBean@7a675056
		System.out.println(bean);
	}
}

1.2 通过ImportSelector接口

  • Import注解可以通过ImportSelector接口的实现类来注册Bean,@Import(DemoImportRegistrar.class)。示例代码如下:。 DemoImportRegistrar是开发人员自定义的一个类,它实现了ImportSelector接口,重写了selectImports()方法,在selectImports()的返回的字符串数组中,添加了SelectorBean类的全类名,SelectorBean是自定义一个类。
/**
* 自定义的一个普通类
*/
public class SelectorBean {
   
}
/**
* 通过@Import导入DemoImportSelector类
* DemoImportSelector类是自定义的一个类,实现了ImportSelector接口
*/
@Configuration
@Import(DemoImportSelector.class)
public class AppConfig {
   
}
/**
* 通过实现ImportSelector接口来向Spring容器中添加一个Bean
* 该类重写了ImportSelector接口的selectImports()方法
*/
public class DemoImportSelector implements ImportSelector {
   

	@Override
	public String[] selectImports(AnnotationMetadata importingClassMetadata) {
   
		// 该方法的返回值是一个String[]数组
		// 向数组中添加类的全类名,这样就能将该类注册到Spring容器中了
		return new String[]{
   "com.tiantang.study.components.SelectorBean"};
	}
}
public class MainApplication {
   

	public static void main(String[] args) {
   
		// 启动容器
		AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
		// 获取bean
		SelectorBean bean = applicationContext.getBean(SelectorBean.class);
		// 打印bean
		// 打印结果:com.tiantang.study.components.SelectorBean@4ef37659
		System.out.println(bean);
	}
}

1.3 通过ImportBeanDefinitionRegistrar接口

  • Import注解可以通过ImportBeanDefinitionRegistrar接口的实现类来注册Bean,@Import(DemoImportRegistrar.class)。示例代码如下:DemoImportRegistrar是开发人员自定义的一个类,它实现了ImportBeanDefinitionRegistrar接口,重写了registerBeanDefinitions()方法。在registerBeanDefinitions()中通过一段代码向Spring中注册了RegistrarBean类(RegistrarBean类是自定义的一个类)。
  • 在重写的registerBeanDefinitions()方法中,加了很详细的注释,方法中的代码可能对于从未接触BeanDefinition类的API的朋友来说,可能比较陌生,多看Spring源码就,多熟悉就好了。
/**
* 自定义的一个普通类
*/
public class RegistrarBean {
   
}
/**
* 通过@Import导入DemoImportRegistrar类
* DemoImportRegistrar类是自定义的一个类
* 实现了ImportBeanDefinitionRegistrar接口
* 重写了registerBeanDefinitions()方法
*/
@Configuration
@Import(DemoImportRegistrar.class)
public class AppConfig {
   
}
/**
* 通过实现ImportBeanDefinitionRegistrar接口,
* 重写registerBeanDefinitions()方法来向Spring容器汇总注册一个bean
*/
public class DemoImportRegistrar implements ImportBeanDefinitionRegistrar {
   

	@Override
	public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
   
		// 通过BeanDefinitionBuilder来创建一个BeanDefinition(建造者设计模式了解一下)
		// 这里也可以直接通过关键字new来创建一个BeanDefinition。由于BeanDefinition是一个接口,接口是不能new的,因此需要n
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值