spring容器注册组件
通过使用注解方式向spring容器中添加组件是十分简单的,大体有如下方式:
- 在config类中通过添加@Bean来添加注解
- 通过扫描添加组件
- 使用@Import添加一个外部组件
- 使用@ImportSelector添加一个组件
- 使用ImportBeanDefinitionRegistrar添加一个组件
- 使用FactoryBean注册组件
在config类中通过添加@Bean来添加注解
使用方式如下:
@Configuration
public class MyConfig {
@Bean
public Target target(){
return new Target();
}
}
通过扫描添加组件
使用@ComponentScan+组件注解@Controller/@Service/@Repository/@Component扫描添加组件使用方式如下:
@ComponentScan("org.springframework.demo")
@Configuration
public class MyConfig {
}
另外,通过扫描方式添加组件的方式可以通过一些注解来配置组件:
- @TypeFilter指定过滤规则
- @Scope设置组件作用域
- @Lazy设置是否懒加载
- @Conditional按照条件注册bean
使用@Import添加一个外部组件
使用方式如下:
@Configuration
@Import(value = {Example1.class})
public class MyConfig {
}
使用@ImportSelector添加一个组件
使用方式如下:
@Configuration
@Import(value = {MyImportSelector.class})
public class MyConfig {
}
使用FactoryBean注册组件
使用方式如下:
@Configuration
@Import(value = {MyBeanDefinitionRegister.class})
public class MyConfig {
}
public class MyBeanDefinitionRegister implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Example1.class);
registry.registerBeanDefinition("Dog",rootBeanDefinition);
}
}
使用FactoryBean注册组件
使用方式如下:
// 创建一个FactoryBean的实现类
public class ExampleFactoryBean implements FactoryBean<Example3> {
// 返回一个Example3对象,这个对象会被添加到spring容器中
@Override
public Example3 getObject() throws Exception {
return new Example3();
}
@Override
public Class<?> getObjectType() {
return Example3.class;
}
// 如果是单例,则返回true,否则返回false
@Override
public boolean isSingleton() {
return true;
}
}
@Configuration
public class MyConfig {
// 将这个FactoryBean的实现类添加到spring容器中
@Bean
public ExampleFactoryBean exampleFactoryBean(){
return new ExampleFactoryBean();
}
}
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MyConfig.class);
ExampleFactoryBean bean = applicationContext.getBean(ExampleFactoryBean.class);
try {
// getObject()返回Example3 bean
System.out.println(bean.getObject());
} catch (Exception e) {
e.printStackTrace();
}