组件扫描(component scanning):Spring能够从classpath下自动扫描,侦测和实例化具有特定注解(annotation)的Bean。
特定注解包括:
@Component:基本注解,标识一个受Spring管理的组件
@Respository:标识持久层组件
@Service:标识服务层(业务层)组件
@Controller:标识表现层组件
对于扫描到的组件,Spring有默认的命名策略:使用非限定类名,第一个字母小写,也可以在注解中通过value属性值标识组件的名称
当在组件类上使用了特定的注解之后,还需要在Spring的配置文件中声明<context:component-scan>
base-package属性指定一个需要扫描的基类包,Spring容器将会扫描这个基类包里及其子包中的所有类。
当需要扫描多个包时,可以使用逗号分隔。
如果仅希望扫描特定的类而非基包下的所有类,可使用resource-pattern属性过滤特定的类
实例:
<context:component-scan base-package="cn">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
</context:component-scan>
<context:include-filter> 子节点表示要包含的目标类
在classpath扫描组件
<context:include-filter>和<context:exclude-filter>子节点支持多种类型的过滤表达式:
annotation:表示排除某些带有指定注解的类
assinable:排除指定的类
组件装配
<context:component-scan>元素还会自动注册AutowiredAnnotationBeanPostProcessor实例,该实例可以自动装配具有@Autowired和@Resource、@Inject注解的属性
使用@Autowired自动装配Bean
@Autowired注解自动装配具有兼容类型的单个Bean属性
构造器,普通字段(即使是非public),一切具有参数的方法都可以应用@Authwired注解
默认情况下,所有使用@Authwired注解的属性都需要被设置,当Spring找不到匹配的Bean装配属性时,会抛出异常,若某一属性允许不被设置,可以设置@Authwired的注解的required属性为false
默认情况下,当IOC容器里存在多个类型兼容的Bean时,通过类型的自动装配将无法工作,此时可以在@Qualifier注解里提供Bean的名称,Spring允许对方法的入参标注@Qualifiter已指定注入Bean的名称
@Authwired注解也可以应用在数组类型的属性上,此时Spring将会把所有匹配的Bean进行自动装配
@Authwired注解也可以应用在集合属性上,此时Spring读取该集合的类型信息,然后自动装配所有与之兼容的Bean
@Authwired注解在java.util.Map上时,若该Map的键值为String,那么Spring将自动装配与之Map值类型兼容的Bean,此时Bean的名称作为键值
使用@Resource或@Inject自动装配Bean
Spring还支持@Resource和@Inject注解,这两个注解和@Autowired的功能类似
@Resource注解要求提供一个Bean名称的属性,若该属性为空,则自动采用标注处的变量或方法名作为Bean的名称
@Resource是JDK自带的注解,耦合度低
@Inject和@Autowired注解一样也是按类型匹配注入的Bean,但没有reqired属性
建议使用@Autowired注解
整合多个配置文件
Spring允许通过<import>将多个配置文件引入到一个文件中,进行配置文件的集成。这样在启动Spring容器时,仅需要指定这个合并好的配置文件就可以。
import元素的resource属性支持Spring的标准的路径资源
<import resource="classpath:applicationcontext-factory.xml"/>