① 使用@Bean
第一種是我們平時使用最多的,主要用于項(xiàng)目內(nèi)部的組件的注入
② 使用@ComponentScan + @Controller/@Service/@Component/Repository
這種主要用于controller,service,dao等層次分明的場景
③ 使用@Impport/實(shí)現(xiàn)ImportSelector
適用于導(dǎo)入外部,第三方組件
有兩種實(shí)現(xiàn)方式:
- 直接導(dǎo)入
@Import(value = {Bus.class})
2.實(shí)現(xiàn)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"};
}
}
④ 實(shí)現(xiàn)ImportBeanDefinitionRegistrar 動態(tài)注冊
ImportBeanDefinitionRegistrar 可以比較靈活的實(shí)現(xiàn)Bean定義信息的注冊,實(shí)際上我們在使用的時候都是通過實(shí)現(xiàn)該接口來達(dá)到按照指定條件注冊bean定義信息,來達(dá)到注入對應(yīng)的Bean到IOC容器的目的,可以靈活的按照自己的邏輯注冊,且可以通過注解來開啟對應(yīng)的功能
比如:SpringCloud框架的FeignClientsRegistrar類也實(shí)現(xiàn)了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;
}