一 解析类
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. matplotlib柱状图-【老鱼学matplotlib】

    柱状图在平常的图表中是非常常用的图,本节我们来看下如何来显示柱状图. 代码为: import numpy as np import pandas as pd import matplotlib.pyp ...

  2. open_basedir php授权目录设置

    php为了安全性考虑,有一项 open_basedir 的设置.根据你web服务器环境,open_basedir可以在几个地方设置. 首先 在php.ini中配置. ;open_basedir = 如 ...

  3. JDK配置环境变量不成功的原因

    根据自己配置环境变量遇到的问题进行总结: 1.二次安装需要注意的问题 由于已经安装了一次的原因,此时的注册表已经有了安装记录. 建议删除jdk的记录 首先打开注册表 开始菜单→运行.或者直接键盘按下W ...

  4. AWS S3 递归上传文件和递归下载文件, 以及S3之间拷贝文件夹

    1. 递归上传文件: aws s3 cp 本地文件夹 s3://bucket-name -- recursive --region us-east-1 2. 递归下载S3上的文件夹: cd  本地下载 ...

  5. ISP PIPLINE (附加1) Green Imbalance

    1.什么是Green imbalance 芯片的Gr和Gb通道获取的能量或者是输出的数据不一致,造成这种情况的原因一方面是Gr,Gb通道的半导体制造工艺方面的差异,另一方面是microlens的存在, ...

  6. mongodb 遇到的问题一 Error: connect ECONNREFUSED 127.0.0.1:27017

    node配合mongodb是配置完成后,访问时出现 Error: connect ECONNREFUSED 127.0.0.1:27017,的报错 原因在于你的mongodb数据库没开, node下的 ...

  7. CSS3_过渡_2D 变换_瓶体旋转_动态时钟

    1. 过渡 transition 允许 CSS 的属性值在一定时间内平滑的过渡, 在鼠标点击,鼠标滑过或对属性改变中触发,并圆滑的改变 CSS 的属性值 简写属性: #box { width: 300 ...

  8. FJUT3260

    不是啊..不是说双栈嘛,,怎么是个**题啊. 链接:  http://120.78.128.11/Problem.jsp?pid=3260    从左到右扫一遍,把相交的区间扔到一起算,那么就变成了一 ...

  9. 书上关于*(p++)表达式的几种变形形式的思考题

    代码: int main(){ int a[10] = { 1,2,3,4,5,6,7,8,9,10 }; int *p = &a[3]; cout << "*p++ = ...

  10. LocalDate

    java中做时间处理时一般会采用java.util.Date,但是相比于Date来说,还有更好的选择 -- java.time.LocalDate. 这是jdk8中新增的日期处理类,同时新增的还有ja ...