3 回答
TA贡献1811条经验 获得超4个赞
自问自答,提出问题第二天就已通过跟踪源码找到答案,说说结果给后人以经验.
为什么会有这样的问题,来自于springcloud feign 远程调用场景,controller继承了api service,在service的方法上定义RequestMapping,controller中不定义,spring同样能扫描到,完成请求地址与方法的映射,这个过程蹊跷的地方在于,接口中定义的注解并不会被类继承,其唯一可以识别到的方式就是 扫描父类,但是一般似乎从来没这么用过,在关于spring源码解析的文章当中也很少有提及扫描组件会去查找父类中的注解,带着问题去跟踪源码,发现,在扫描组件过程中反复调用了 这么一个类AnnotatedElementUtils,其中的方法searchWithGetSemantics,语义化搜索,什么叫语义化搜索,该类的注释已明确给出了答案.
` * <p>{@code AnnotatedElementUtils} defines the public API for Spring's
- meta-annotation programming model with support for annotation attribute
- overrides. If you do not need support for annotation attribute
- overrides, consider using {@link AnnotationUtils} instead. * <p>Find semantics are much more exhaustive, providing
- get semantics plus support for the following:
*
- <ul>
- <li>Searching on interfaces, if the annotated element is a class
- <li>Searching on superclasses, if the annotated element is a class
- <li>Resolving bridged methods, if the annotated element is a method
- <li>Searching on methods in interfaces, if the annotated element is a method
- <li>Searching on methods in superclasses, if the annotated element is a method
- </ul>`
TA贡献1853条经验 获得超18个赞
这里有非常好的例子展示spring扫描的范围设定
符合以下条件的会被扫描并创建bean
- 类有
@Component
注解 - 且包名包含在
@ComponentScan
注解范围内 - 或包含在
@ComponentScan.Filter
范围内
如果子类符合条件,但父类没有包含在扫描范围内, 子类会创建,但父类不会创建, 因为不符合instanceof
条件,即不能说父类是子类
如果父类被创建, 子类有@Component
注解,但不在指定Filter范围内,也会创建,因为符合instanceof
条件,因为子类一定是父类
@Component
注解没有继承关系(@Inherited
), 所以想被创建必须首先要有这个注解才行.
或创建你自己的可继承的注解过的接口.
如:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Component
@Inherited
public @interface BusinessService {
}
添加回答
举报