IoC添加组件的方式和使用场景

2020-09-06  本文已影响0人  远去的桅杆_

① 使用@Bean

第一种是我们平时使用最多的,主要用于项目内部的组件的注入

② 使用@ComponentScan + @Controller/@Service/@Component/Repository

这种主要用于controller,service,dao等层次分明的场景

③ 使用@Impport/实现ImportSelector

适用于导入外部,第三方组件
有两种实现方式:

  1. 直接导入
@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;

}
上一篇 下一篇

猜你喜欢

热点阅读