标签:默认 src ports root bean 生效 ada 一个 java
本文把注入的类型分为普通类和配置文件类两种
@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是个接口,它只有一个方法:
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也是个接口,它只有一个方法:
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);
}
}
待续。。。
标签:默认 src ports root bean 生效 ada 一个 java
原文地址:https://www.cnblogs.com/yw0219/p/9058605.html