1. 程式人生 > >Springboot學習筆記(三)-常用註入組件方式

Springboot學習筆記(三)-常用註入組件方式

TP 情況 生效 data lec 同時 pri select registry

本文把註入的類型分為普通類和配置文件類兩種

普通類

包掃描@ComponentScan+組件標註註解(@Controller@Service@Repository@Component)

包掃描不是必須的,指定包名後以指定的包名為準,比如指定包名為a:@ComponentScan("a"),即使b包中有標註@Controller等註解的bean也不註冊。

包掃描註解除了默認的value()還有basePackages()basePackageClasses()等方法:

basePackages(): 指定掃描的包名(前綴)

basePackageClasses():如果指定為A.class

,那麽會掃描A類所在包的類。

includeFilters():將所指定的類註入容器。
excludeFilters():將所指定的類排除。
技術分享圖片

@Bean

可以放在方法和註解上。

一般放在標有@Configuration類中的方法上。如:
技術分享圖片

@Import

只能用在類上,最簡單直觀,將A註入:
技術分享圖片

雖然直觀,但需要批量註入就有點麻煩,@Import提供了高級功能:
技術分享圖片

ImportSelector

ImportSelector是個接口,它只有一個方法:

String[] selectImports(AnnotationMetadata importingClassMetadata);

返回值是需要註入的類型全類名,入參是指和@Import

並列的全部註解信息,比如有個實現類:

public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        if (importingClassMetadata.hasAnnotation(UsesJava8.class.getName())) {
            return new String[]{A.class.getName()};
        }
        return new String[0];
    }
}

表示只有@UsesJava8@Import同時標註時才註入A,以下情況會生效:

@SpringBootApplication
@Import(MyImportSelector.class)
@UsesJava8
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

ImportBeanDefinitionRegistrar

ImportBeanDefinitionRegistrar也是個接口,它只有一個方法:

    public void registerBeanDefinitions(
            AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry);

簡單實現如下:

public class MyImportSelector implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        registry.registerBeanDefinition("IThreadPool", new RootBeanDefinition(A.class));
    }
}

調用:

@SpringBootApplication
@Import(MyImportSelector.class)
@UsesJava8
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

配置文件類

待續。。。

Springboot學習筆記(三)-常用註入組件方式