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

–> go to 总目录

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配置
在这里插入图片描述
注意 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.MyTypeFilterA 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文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值