Springboot學習筆記(三)-常用註入組件方式
阿新 • • 發佈:2018-05-19
TP 情況 生效 data lec 同時 pri select registry 包掃描
,那麽會掃描A類所在包的類。
並列的全部註解信息,比如有個實現類:
本文把註入的類型分為普通類和配置文件類兩種
普通類
包掃描@ComponentScan
+組件標註註解(@Controller
、@Service
、@Repository
、@Component
)
包掃描不是必須的,指定包名後以指定的包名為準,比如指定包名為a:@ComponentScan("a")
,即使b包中有標註@Controller
等註解的bean也不註冊。
包掃描註解除了默認的value()
還有basePackages()
、basePackageClasses()
等方法:
basePackages()
: 指定掃描的包名(前綴)
basePackageClasses()
:如果指定為A.class
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學習筆記(三)-常用註入組件方式