① 使用@Bean
第一种是我们平时使用最多的,主要用于项目内部的组件的注入
② 使用@ComponentScan + @Controller/@Service/@Component/Repository
这种主要用于controller,service,dao等层次分明的场景
③ 使用@Impport/实现ImportSelector
适用于导入外部,第三方组件
有两种实现方式:
- 直接导入
@Import(value = {Bus.class})
2.实现ImportSelector
@Configuration
@Import(value = { MyImportSelector.class})
public class InitBean {
@Resource
private Car car;
}
public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
return new String[]{"com.caril.learn.initBean.Car"};
}
}
④ 实现ImportBeanDefinitionRegistrar 动态注册
ImportBeanDefinitionRegistrar 可以比较灵活的实现Bean定义信息的注册,实际上我们在使用的时候都是通过实现该接口来达到按照指定条件注册bean定义信息,来达到注入对应的Bean到IOC容器的目的,可以灵活的按照自己的逻辑注册,且可以通过注解来开启对应的功能
比如:SpringCloud框架的FeignClientsRegistrar类也实现了ImportBeanDefinitionRegistrar
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry, BeanNameGenerator importBeanNameGenerator) {
RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Trunk.class);
registry.registerBeanDefinition("trunk", rootBeanDefinition);
}
}
@Import(value = {MyImportBeanDefinitionRegistrar.class})
public class InitBean {
@Resource
private Trunk trunk;
}