前言
配置注解,指@Configuration,@ComponentScan,@Scope,@Lazy,@Conditional,@Import等注解,本篇文章将对这些注解的使用进行详细总结。
Springboot版本:2.4.1
Spring版本:5.3.2
正文
一. @Configuration
@Configuration注解修饰的类就是配置类,配合@Bean注解使用,可以用于向容器注册bean。如下是示例(所有类全部放在同一包目录下)。
业务类如下所示。
public class MyService {}
复制代码
由@Configuration注解修饰的业务类如下所示。
@Configuration
public class MyConfig {
@Bean
public MyService myService() {
return new MyService();
}
}
复制代码
测试类如下所示。
public class MyTest {
public static void main(String[] args) {
ApplicationContext applicationContext
= new AnnotationConfigApplicationContext(MyConfig.class);
}
}
复制代码
运行测试程序,可以将MyService的bean注册到容器中,并且bean名称为myService,日志打印如下所示。
二. @ComponentScan
@ComponentScan注解用于扫描并注册bean到容器中。如下是示例(所有类全部放在同一包目录下)。
业务类如下所示。
@Component
public class MyDao {}
@Component
public class MyService {}
复制代码
配置类如下所示。
@Configuration
@ComponentScan(value = "com.learn.spring.annotation.componentscan",
useDefaultFilters = true)
public class MyConfig {}
复制代码
测试类如下所示。
public class MyTest {
public static void main(String[] args) {
ApplicationContext applicationContext
= new AnnotationConfigApplicationContext(MyConfig.class);
}
}
复制代码
运行测试程序后,会把com.learn.spring.annotation.componentscan包目录下的MyService和MyDao的bean注册到容器中。上面的配置类的@ComponentScan注解的value指示扫描哪个包目录及其子目录下的类,同时useDefaultFilters字段为true(不显示指定也为true)表示使用默认过滤规则,默认过滤规则就是将指定路径下所有由@Controller,@Service,@Repository和@Component注解修饰的类的bean注册到容器中。
现在将useDefaultFilters配置为true,并编写一个自定义过滤器MyTypeFilter,如下所示。
public class MyTypeFilter implements TypeFilter {
/**
* @param metadataReader 可以获取当前正在操作的类的信息
* @param metadataReaderFactory 可以获取上下文中所有类的信息
*/
@Override
public boolean match(MetadataReader metadataReader,