【Spring源码解析】组件注册-@ComponentScan注册bean

前言

接上一篇 Spring源码解析之注解注册bean

实现

  1. 按照平时的开发, 我们创建几个类
1
2
3
@Controller
public class BookController {
}
1
2
3
@Service
public class BookService {
}
1
2
3
@Repository
public class BookDao {
}
  1. 配置
1
2
3
4
5
6
7
8
9
@Configuration
@ComponentScan(value = "cn.idea360")
public class BeanConfig {

@Bean
public Person person() {
return new Person("config", 18);
}
}
  1. 引入单元测试
1
2
3
4
5
6
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
  1. 测试
1
2
3
4
5
6
7
8
9
10
11
class IocTest {

@Test
public void test01() {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(BeanConfig.class);
String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
for (String name: beanDefinitionNames) {
System.out.println(name);
}
}
}

输出结果

1
2
3
4
5
6
7
8
9
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
beanConfig
bookController
bookDao
bookService
person

可以看出我们添加了注解并在指定包下的bean全部被注册进了容器

  1. 如果我们想按注解排除一部分
1
2
3
4
5
6
7
8
9
10
11
@Configuration
@ComponentScan(value = "cn.idea360", excludeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION, value = {Controller.class})
})
public class BeanConfig {

@Bean
public Person person() {
return new Person("config", 18);
}
}

最后

本篇到此结束,欢迎大家关注公众号【当我遇上你】。