【Spring系列给IOC容器添加组件的几种方式总结】
给Spring 注册Bean的几种方式总结。其中使用
@Import
注解是Spring Boot 完成自动配置的一个核心注解。
1、Spring 中给IOC容器添加组件的几种方式
- 在Spring的配置文件中,配置Bean(基于XML方式)
- 使用注解(
@Controller
、@Service
等)配合上组件扫描器@ComponentScan
- 使用
@Bean
注解 - 使用
@Import
注解 - 使用Spring 提供的
FactoryBean
2、对部分方式进行实现
2.1、使用@Bean
注解
- 第一步:定义一个普通类
Foo
publicclassFoo{}
- 第二步:定义一个配置类
@ConfigurationpublicclassExampleConfiguration{
@Bean
public Foo foo(){
returnnew Foo();
}
}
- 第三步:测试,遍历全部的Bean
publicclassSpringApplication{publicstaticvoidmain(String[] args){
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ExampleConfiguration.class);
String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
for (String delegate : beanDefinitionNames){
System.out.println("Bean Name : "+delegate);
}
applicationContext.close();
}
}
- 第四步:测试运行结果
Bean Name : org.springframework.context.annotation.internalConfigurationAnnotationProcessor信息: Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@37bba400: startup date [Tue Jul 17 17:36:15 CST 2018]; root of context hierarchy
Bean Name : org.springframework.context.annotation.internalAutowiredAnnotationProcessor
Bean Name : org.springframework.context.annotation.internalRequiredAnnotationProcessor
Bean Name : org.springframework.context.annotation.internalCommonAnnotationProcessor
Bean Name : org.springframework.context.event.internalEventListenerProcessor
Bean Name : org.springframework.context.event.internalEventListenerFactory
Bean Name : exampleConfiguration
Bean Name : foo
@Bean
注解导入的Bean,默认Bean name为方法名
2.2、使用@Import
注解
2.2.1、@Import(Foo.class)
- 第一步:修改配置类
@Configuration@Import(Foo.class)
publicclassExampleConfiguration{
}
- 第二步:测试
publicclassSpringApplication{publicstaticvoidmain(String[] args){
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ExampleConfiguration.class);
String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
for (String delegate : beanDefinitionNames){
System.out.println("Bean Name : "+delegate);
}
applicationContext.close();
}
}
- 第三步:测试结果
Bean Name : org.springframework.context.annotation.internalConfigurationAnnotationProcessorBean Name : org.springframework.context.annotation.internalAutowiredAnnotationProcessor
Bean Name : org.springframework.context.annotation.internalRequiredAnnotationProcessor
Bean Name : org.springframework.context.annotation.internalCommonAnnotationProcessor
Bean Name : org.springframework.context.event.internalEventListenerProcessor
Bean Name : org.springframework.context.event.internalEventListenerFactory
Bean Name : exampleConfiguration
Bean Name : com.hanson.bean.Foo
@Import
导入的Bean 默认的Bean Name 为Bean 的全限定名称
2.2.2、@Import(FooImportSelectorImpl.class)
- 第一步:定义一个类实现
ImportSelector
接口,并覆写其方法selectImports
publicclassFooImportSelectorImplimplementsImportSelector{@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
returnnew String[]{"com.hanson.bean.Foo"};
}
}
- 第二步:修改配置类
@Configuration@Import(FooImportSelectorImpl.class)
publicclassExampleConfiguration{
}
- 第三步:启动测试类,查看运行结果
Bean Name : org.springframework.context.annotation.internalConfigurationAnnotationProcessorBean Name : org.springframework.context.annotation.internalAutowiredAnnotationProcessor
Bean Name : org.springframework.context.annotation.internalRequiredAnnotationProcessor
Bean Name : org.springframework.context.annotation.internalCommonAnnotationProcessor
Bean Name : org.springframework.context.event.internalEventListenerProcessor
Bean Name : org.springframework.context.event.internalEventListenerFactory
Bean Name : exampleConfiguration
Bean Name : com.hanson.bean.Foo
这个方式有点控制反转的意思,就是只需要提供一个类的全限定名称,就能帮助我们注入到容器中。
2.2.3、@Import(FooImportBeanDefinitionRegistrarImpl.class)
,
- 第一步:定义一个类实现
ImportBeanDefinitionRegistrar
并覆写其方法registerBeanDefinitions
publicclassFooImportBeanDefinitionRegistrarImplimplementsImportBeanDefinitionRegistrar{@Override
publicvoidregisterBeanDefinitions(AnnotationMetadata importingClassMetadata,
BeanDefinitionRegistry registry){
RootBeanDefinition beanDefinition = new RootBeanDefinition();
beanDefinition.setBeanClass(Foo.class);
registry.registerBeanDefinition("fooExample", beanDefinition);
}
}
- 第二步:修改配置类
@Configuration@Import(FooImportBeanDefinitionRegistrarImpl.class)
publicclassExampleConfiguration{
}
- 第三步:运行测试类,并查看结果
Bean Name : org.springframework.context.annotation.internalConfigurationAnnotationProcessorBean Name : org.springframework.context.annotation.internalAutowiredAnnotationProcessor
Bean Name : org.springframework.context.annotation.internalRequiredAnnotationProcessor
Bean Name : org.springframework.context.annotation.internalCommonAnnotationProcessor
Bean Name : org.springframework.context.event.internalEventListenerProcessor
Bean Name : org.springframework.context.event.internalEventListenerFactory
Bean Name : exampleConfiguration
Bean Name : fooExample
这个方式需要程序员手动构建一个BeanDefinition
对象。并且为他设置一个Bean Name
以上是 【Spring系列给IOC容器添加组件的几种方式总结】 的全部内容, 来源链接: utcz.com/z/514547.html