一 解析类
ComponentScanBeanDefinitionParser component-scan标签解析类
component-scan 兼容 annotation-config ,因此前者配置后,后者不用在配置
二 解析类作用
1、基本包的扫描
2、类型过滤器的配置
3、 annotation-config配置的兼容
4、 注解处理器BeanPostProcessor的注册
三 解析过程
解析标签 <context component-scan base-package="com.icbc.inc,com.icbc.chg">
1.package扫描,多个包之间可能,分割;也有可能;分割 分割后得到一个包数组
String[] basePackages = StringUtils.tokenizeToStringArray(basePackage,ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS);
2.配置scanner configureScanner(parserContext, element);
配置过滤器 如果标签中有 use-default-filters属性 使用配置的过滤器,如果没有,则使用默认
1.使用默认过滤器,默认过滤器注册过程
ClassPathBeanDefinitionScanner scanner = createScanner(parserContext.getReaderContext(), useDefaultFilters);
创建scanner new ClassPathBeanDefinitionScanner 在ClassPathBeanDefinitionScanner中,使用多态将默认的过滤器注册进去
ClassPathScanningCandidateComponentProvider#ClassPathScanningCandidateComponentProvider-->registerDefaultFilters 方法
与 Component 同包 有 Controller,Repository,Service
Controller上面有Component注解,说明Controller是Component的子标签,同理 爱他两个也是Component的子标签
所以 注册Component注解,同时 Controller,Repository,Service也被注册进去
2.自定义过滤器注册过程 parseTypeFilters
use-default-filters 属性如果为false 就会使用自定义过滤器,此方法就是为了解析自定义过滤器
<context:component-scan base-package="com.icbc.inc,com.icbc.chg" use-default-filters="false">
<context :include-filter type ="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-sca>
如果localName 是include-filter 创建过滤器 根据type返回不同的过滤器
type: annotation assignable aspectj regex custom
3.扫描 doScan
1.findCandidateComponents
1.扫描的肯定是class文件,配置文件中包配置肯定是以.配置,先将.替换成/
ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + resolveBasePackage(basePackage) + "/" + this.resourcePattern;
2.扫描到具体某个class对象,将其封装成resource对象 ,resource对象有一个属性为InputSource 输入流
Resource[] resources = this.resourcePatternResolver.getResources(packageSearchPath);
GenericApplicationContext#getResources-->this.resourceLoader).getResources(locationPattern)
PathMatchingResourcePatternResolver#getResources
3.每一个resource对象都会封装成MetadataReader对象,如果有component注解,创建ScannedGenericBeanDefinition对象,并加入到返回到的集合中
MetadataReader metadataReader = this.metadataReaderFactory.getMetadataReader(resource);
ScannedGenericBeanDefinition sbd = new ScannedGenericBeanDefinition(metadataReader);
2.遍历返回的集合,如果是AnnotatedBeanDefinition类型,执行方法
AnnotationConfigUtils.processCommonDefinitionAnnotations((AnnotatedBeanDefinition) candidate);
1.解析bean的属性(懒加载等等)
AnnotationConfigUtils#processCommonDefinitionAnnotations-->processCommonDefinitionAnnotations
3.将一个个bean封装成BeanDefinitionHolder,注册,放到集合中返回
bean注册进map中,beanName加入到一个集合中,以后实例化用(DefaultListableBeanFactory实现的)
4.registerComponents
1.实现对annotation-config标签的兼容<component-scan annotation-config="true">
首先判断component-scan中是否配置了annotaion-config属性,值为配置的属性值
如果没有配置annotaion-config属性,直接为true
2.如果上述标志位为true
Set<BeanDefinitionHolder> processorDefinitions =
AnnotationConfigUtils.registerAnnotationConfigProcessors(readerContext.getRegistry(), source);
此方法中实现了对 @Autowired @Required @Resource注解的实现
AutowiredAnnotationBeanPostProcessor RequiredAnnotationBeanPostProcessor CommonAnnotationBeanPostProcessor
xml
优点:0侵入性,不用继承接口,在配置文件中,多有实例都会new出来
缺点:配置混乱,尤其是项目变大

annotation:
优点:简单使用
缺点:侵入性太强

springMVC--annotation的更多相关文章

  1. SpringMVC笔记:annotation注解式开发

    一.配置式开发 在我们之前的学习中,springmvc使用配置式开发模式,需要在核心配置文件中springmvc.xml注册大量的bean来注入controller控制器,工作繁琐容易出错,下面我们学 ...

  2. springmvc入门基础之注解和参数传递

    一.SpringMVC注解入门 1. 创建web项目2. 在springmvc的配置文件中指定注解驱动,配置扫描器 <!-- mvc的注解驱动 --> <mvc:annotation ...

  3. SpringMVC—Struts2拦截器学习网址整理

    引自:http://blog.csdn.net/wp1603710463/article/details/49982683 SpringMVC—Struts2拦截器学习网址整理 最近项目中遇到权限相关 ...

  4. SpringMVC入门(基于注解方式实现)

    ---------------------siwuxie095                             SpringMVC 入门(基于注解方式实现)         SpringMVC ...

  5. springmvc注解和参数传递

    一.SpringMVC注解入门 1. 创建web项目2. 在springmvc的配置文件中指定注解驱动,配置扫描器 <!-- mvc的注解驱动 --> <mvc:annotation ...

  6. 用注解开发SpringMVC

    Spring2.5以后,用注解开发SpringMVC的功能十分强大,注解也是SpringMVC的精髓.在实际开发中,都会使用注解来实现. 这让SpringMVC开发工作量最小化,开发者只要专注于业务逻 ...

  7. SpringMVC--从理解SpringMVC执行流程到SSM框架整合

    前言 SpringMVC框架是SSM框架中继Spring另一个重要的框架,那么什么是SpringMVC,如何用SpringMVC来整合SSM框架呢?下面让我们详细的了解一下. 注:在学习SpringM ...

  8. 学习笔记_J2EE_SpringMVC_02_注解配置

    SpringMVC注解配置 1.测试环境: 名称 版本 备注 操作系统 Windows10 专业版1809X64   WEB服务器 Tomcat 8.5 X64   浏览器 Google Chrome ...

  9. SpringMvc的xml配置与annotation配置的例子的区别

    1.导入jar包时,要在xml配置基础上加 spring-aop-4.2.2.RELEASE.jar (注解的时候需要) 2.编写controller的时候要annotation需要做相关配置即红色部 ...

  10. Spring+springmvc+Mybatis整合案例 annotation版(myeclipse)详细版

    Spring+springmvc+Mybatis整合案例 Version:annotation版 文档结构图: 从底层开始做起: 01.配置web.xml文件 <?xml version=&qu ...

随机推荐

  1. (三)ajax请求不同源之websocket跨域

    WebSocket是一种通信协议,使用ws://(非加密)和wss://(加密)作为协议前缀.该协议不实行同源政策,只要服务器支持,就可以通过它进行跨源通信. 一.WebSocket目标 在一个单独的 ...

  2. HDU 3949 XOR [线性基|高斯消元]

    目录 题目链接 题解 代码 题目链接 HDU 3949 XOR 题解 hdu3949XOR 搞死消元找到一组线性无关组 消出对角矩阵后 对于k二进制拆分 对于每列只有有一个1的,显然可以用k的二进制数 ...

  3. Java中在实例化一个类时,这个类中没有初始值的int类型成员变量i,i的值是不是0?

    java中有两种类型一种是数值性,另一种是类变量数值性变量的初始值为0,类变量的初始化为null没做初始化成员变量int性变量是0, 在java中有这么一条规则,声明在方法中的变量在使用时必须要初始化 ...

  4. idea搜索jar中的类

    ctrl+n快捷键

  5. 判断点在不在多边形范围内c#

    C# 计算地图上某个坐标点的是否在多边形内   这个方法引用自群友的博客 https://www.xiaofengyu.com/?p=143 使用百度地图的时候,常常会用到判断一个点是否在一个多边形的 ...

  6. 给出两个单词word1和word2,写一个函数计算出将word1 转换为word2的最少操作次数。

    问题: 给出两个单词word1和word2,写一个函数计算出将word1 转换为word2的最少操作次数. 你总共三种操作方法: 1.插入一个字符 2.删除一个字符 3.替换一个字符 格式: 输入行输 ...

  7. with(window) onload=onresize=function(){} 写法

    with(window) onload=onresize=function(){} 写法 with的用法: with(对象A) { 语句块 } 语句块中可以直接使用 对象A中的属性和方法 ------ ...

  8. ftp搭建安装

    本文摘要:https://jingyan.baidu.com/article/380abd0a77ae041d90192cf4.html FTP 是File Transfer Protocol(文件传 ...

  9. 51nod 1617 奇偶数组

    传送门 回来看一眼51nod,发现自己掉到rank4了,赶紧切道题回rank3. 一眼不会做,这种东西应该慢慢找规律吧……然后看到数据范围其实比较小,应该是单次log的,那是不是可以分治啊. #inc ...

  10. debian包的补丁管理工具:quilt

    最近项目是改pam软件包,给里面添加一些功能.其中遇到了更改后,代码提交方式的问题.这里转载的文章介绍了使用quilt管理补丁的详细方法: 转自:http://blog.csdn.net/fmddlm ...