b spring之bean的扫描和组件管理 scan & components

10 类路径的扫描 和管理组件

如何加载
前面多数的部分使用xml来描述定义BeanDefinition。第9节是关于注解的使用(在源码级别),但是注解仅仅停留在依赖的注入。但是对于最基础的描述还是基于比较精准的xml描述。这个章节会描述如何通过扫描classpath来兼容的侦测到候选的组件。候选组件是一堆类,待被容器按照一些过滤条件加载的类。同样的你也可以是用注解,AspectJ 表达式,或者自定义的过滤条件来选择性注册。

! spring 从3.0开始有很多特性(依赖javaConfig项目),可以使用注解@Configuration @Bean @Import @DependsOn
而不是xml来配置项目

10.1 @Comopent 和 模板注解的用法

说明概念
@Repository可以标注在任何类或者存储模板类上(DAO的角色:data Access OBject)。甚至包括异常的自动转化。
Spring 提供了很多模板注解:

  • @Component
  • @Service
  • @Controller
  • @Repository

@Component 用来生成Spring-managend的模板注解的。
@Repository ,@Service, @Controller,都是@Companent的具体化组件被用于不同情形(持久层,服务,和描述层)。因此,你可以给你的组件标上@Component。但是被标记上@Repository ,@Service, @Controller注解的话,你的类有更多要处理的地方。类如模板注解会被标记为pointcuts切点。
这三个注解在spring的更高级版本会携带更多的语义。因此对于你的service而言,@Service是更好的选择,而非@Component。雷颂德,启动时,@Respository也支持对持久层自动的异常类型转化

10.2 元注解和组注合注解

使用Meta-annotations和 Composed Annotations

元注解-被用在其他注解上的基础注解
比如,@Service被@Component注解
b spring之bean的扫描和组件管理 scan & components
组合注解
类如@ResController就是 @Controller和@ResponseBody的组合注解
b spring之bean的扫描和组件管理 scan & components
另外组合注解可以声明属性变量,也可以为一些注解赋默认值。类如@SessionScope注解将Scope的类硬指定为session,但是仍旧可以自定义proxyMode类型,如下
b spring之bean的扫描和组件管理 scan & components
默认使用
b spring之bean的扫描和组件管理 scan & components
指明类型
b spring之bean的扫描和组件管理 scan & components
更多指导
注解编程指南

10.3 自动识别类和注解Bean的定义(ComponentScan)

spring可以自动识别bean, 并将其注册到Application中去
如下两个类会被标记为Bean
b spring之bean的扫描和组件管理 scan & components
配置扫描路径
除了使用注解标记为Bean之外还要,配置@ComponmentScan到你的@Configure类上–配置基础package。
@ComponmentScan也支持配置逗号,分号,空格分割的多个package或class路径
b spring之bean的扫描和组件管理 scan & components
等同于如下的xml配置
b spring之bean的扫描和组件管理 scan & components
注意 AutowiredAnnotationBeanPostProcessorCommonAnnotationBeanPostProcessor 是兼容的当你使用Component-sacn标签时. 这意味着无需在xml中配置

10.4 使用 Filters 来自定义 扫描

默认的,标记了@Component, @Repository, @Service, @Controller, @Configuration或者其他自定义注解中有@Component注解的类都会被识别为候选组件。你可以添加和排除组件利用includeFiltersexcludeFilters属性(在xml中是 <context:include-filter /> <context:exclude-filter /> 作为<context:component-scan> 的子元素)

过滤类型 示例 描述
annotation (default)用注解 org.example.SomeAnnotation 被标记在其他注解上
assignable 指定 org.example.SomeClass 类或者接口,别目标组件标记
aspectj 切点匹配 org.example…*Service+ An AspectJ type 类型表达式 可以匹配任意的
regex 正则表达式 org.example.Default.* 正则表达式匹配类名
custom 自定义 org.example.MyTypeFilter A custom implementation of the org.springframework.core.type.TypeFilter interface.

过滤实例

b spring之bean的扫描和组件管理 scan & components
等同于
b spring之bean的扫描和组件管理 scan & components

10.5 在Components内定义Bean

如下定义了一个Bean
b spring之bean的扫描和组件管理 scan & components

只能在 @Autowired和@Inject上使用@Lazy注解

b spring之bean的扫描和组件管理 scan & components

行为解释

Spring FrameWork 4.3以后,你也可以声明一个带参数InjectionPoint的方法,在创建这个bean得时候靠近这个bean。注意这里是创建动作,而不是注入动作。这个对prototype有影响,因为其每次都会生成一个新的。如下的语义可以在每次穿件是使用InjectionPoint,这个是正确用法。
b spring之bean的扫描和组件管理 scan & components

10.6 被自动检测 Componment的命名

主动命名

被命名为MyMovieLister
b spring之bean的扫描和组件管理 scan & components

默认命名

默认命名为MovieFinderImpl
b spring之bean的扫描和组件管理 scan & components

自定义默认命名策略

需要实现 BeanNameGenerator 接口
b spring之bean的扫描和组件管理 scan & components

10.7 提供Socped给被检测Componment

使用默认策略

默认是singleton,可以主动指定
b spring之bean的扫描和组件管理 scan & components

使用自定义的scope策略

需要继承ScopeMetadataResolver接口
b spring之bean的扫描和组件管理 scan & components

非singleton使用代理

在scope中有描述原因:某些bean是singleton,需要在使用时获取属性,最好的方式是使用代理方式,对singletonBean加以处理
b spring之bean的扫描和组件管理 scan & components

10.8 用注解提供识别信息 Qualifier

b spring之bean的扫描和组件管理 scan & components
以下是自定义的注解
b spring之bean的扫描和组件管理 scan & components

10.9 候选组件索引的生成

可以预先生成一个索引来加快启动速度

尽管类路径扫描非常快,但是可以通过在编译时创建候选静态列表来提高大型应用程序的启动性能。在这种模式下,作为组件扫描目标的所有模块都必须使用此机制。

您现有的@ComponentScan或<context:component-scan指令必须保留原样,以请求上下文扫描某些程序包中的候选对象。当ApplicationContext检测到这样的索引时,它将自动使用它而不是扫描类路径。

加入依赖

b spring之bean的扫描和组件管理 scan & components
运行后会在 jarfile生成META-INF/spring.components文件