扫描下方二维码或者微信搜索公众号
菜鸟飞呀飞
,即可关注微信公众号,阅读更多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