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注解组合注解
类如@ResController就是 @Controller和@ResponseBody的组合注解
另外组合注解可以声明属性变量,也可以为一些注解赋默认值。类如@SessionScope注解将Scope的类硬指定为session
,但是仍旧可以自定义proxyMode
类型,如下
默认使用
指明类型
更多指导
注解编程指南
10.3 自动识别类和注解Bean的定义(ComponentScan)
spring可以自动识别bean, 并将其注册到Application中去
如下两个类会被标记为Bean
配置扫描路径
除了使用注解标记为Bean之外还要,配置@ComponmentScan到你的@Configure类上–配置基础package。
@ComponmentScan也支持配置逗号,分号,空格分割的多个package或class路径
等同于如下的xml配置
注意 AutowiredAnnotationBeanPostProcessor
和 CommonAnnotationBeanPostProcessor
是兼容的当你使用Component-sacn
标签时. 这意味着无需在xml中配置
10.4 使用 Filters 来自定义 扫描
默认的,标记了@Component, @Repository, @Service, @Controller, @Configuration或者其他自定义注解中有@Component注解的类都会被识别为候选组件。你可以添加和排除组件利用includeFilters
或excludeFilters
属性(在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. |
过滤实例
等同于
10.5 在Components内定义Bean
如下定义了一个Bean
只能在 @Autowired和@Inject上使用@Lazy注解
行为解释
Spring FrameWork 4.3以后,你也可以声明一个带参数InjectionPoint
的方法,在创建这个bean得时候靠近这个bean。注意这里是创建动作,而不是注入动作。这个对prototype
有影响,因为其每次都会生成一个新的。如下的语义可以在每次穿件是使用InjectionPoint
,这个是正确用法。
10.6 被自动检测 Componment的命名
主动命名
被命名为MyMovieLister
默认命名
默认命名为MovieFinderImpl
自定义默认命名策略
需要实现 BeanNameGenerator 接口
10.7 提供Socped给被检测Componment
使用默认策略
默认是singleton,可以主动指定
使用自定义的scope策略
需要继承ScopeMetadataResolver接口
非singleton使用代理
在scope中有描述原因:某些bean是singleton,需要在使用时获取属性,最好的方式是使用代理方式,对singletonBean加以处理
10.8 用注解提供识别信息 Qualifier
以下是自定义的注解
10.9 候选组件索引的生成
可以预先生成一个索引来加快启动速度
尽管类路径扫描非常快,但是可以通过在编译时创建候选静态列表
来提高大型应用程序的启动性能。在这种模式下,作为组件扫描目标的所有模块都必须使用此机制。
您现有的@ComponentScan或<context:component-scan指令必须保留原样,以请求上下文扫描某些程序包中的候选对象。当ApplicationContext检测到这样的索引时,它将自动使用它而不是扫描类路径。
加入依赖
运行后会在 jarfile生成META-INF/spring.components
文件