spring之component-scan自动扫描bean
之前讲到可以通过beans元素下面配置bean,可以使用xml或注解自动装配bean属性。现在,spring还可以自动把POJO(简单Java对象)自动配置为bean,不再需要用xml中配置bean元素。
一. 启用自动扫描bean
在beans配置文件中配置<context:component-scan>元素启用自动扫描。spring会在指定的包下扫描bean。
<context:component-scan base-package="xyz.totok"/>
二. 使用特殊注解需要自动配置的Java类
启用自动扫描bean后,spring会扫描具有特殊注解的Java类,然后把这些类对象添加应用上下文中配置为bean。特殊注解如下:
- @Component 通用的构造型注解,标识该类为spring组件。
- @Controller 标识该类定义为Spring MVC Controller
- @Repository 标识该类定义为数据仓库
- @Service 标识该类定义为服务
- 使用@Component标注的任意自定义注解
如下使用@Component标识的类
@Component
public class User{}
这个时候spring会自动添加一个user的bean到应用上下文中。
也可以自定义bean的id
@Component("andy")
public class User{}
三. 扫描过滤
扫描过滤机制:<context:include-filter>和<context:exclude-filter>添加扫描过滤内容。如下把所有User的派生类添加到bean。
<context:component-scan base-package="xyz.totok">
<context:include-filter type="assignable" expression="xyz.totok.User"/>
</context:component-scan>
扫描过滤通过两个属性(type和expression)来决定过滤规则。type代表扫描类型,总共有5种扫描类型。
过滤器类型 | 描述 |
---|---|
annotation | 扫描使用指定注解所标注的类,通过expression来指定要扫描的注解 |
assignable | 扫描派生于expression属性指定的那些类 |
aspectj | 扫描expression属性指定的Aspect J表达式所匹配的那些类 |
custom | 使用自定义的过滤实现类,该类由expression属性决定,该类实现org.springframework.core.TypeFilter |
regex | 扫描类名称与expression指定的正则表达式匹配的那些类 |
四. 自定义扫描配置类
component-scan会扫描指定包下面的@Configuration标注的类,该注解标注的类等价于<beans>元素。然后使用@Bean标注bean。
@Configuration
public class SpringMyConfig{
@Bean
public User user1(){
return new User();
}
}