一 解析类
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. 用PHPExcel导出导入Excel

    thinkPHP5.0框架 查询数据库调用Excel方法 public function exportlist(){ $orderModel = new OrderModel(); if($start ...

  2. 微服务化不同阶段 Kubernetes 的不同玩法

    本文由  网易云发布. 作为容器集群管理技术竞争的大赢家,Kubernetes 已经和微服务紧密联系,采用 Kubernetes 的企业往往都开始了微服务架构的探索.然而不同企业不同阶段的微服务实践面 ...

  3. python实现FTP程序

    python实现FTP程序 程序源码 上传功能 查看文件 cd功能 创建目录 程序源码 目录结构 服务端 主程序 import optparse import socketserver import ...

  4. (三)ajax请求不同源之cors跨域

    一.基本原理 CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)它允许浏览器向跨源服务器,发出 XMLHttpReque ...

  5. django——用户认证组件

    用户认证 auth模块 1 from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其中的三个: 1.1 .authenti ...

  6. JavaScript(六)

    定时器 定时器在javascript中的作用1.制作动画2.异步操作3.函数缓冲与节流 定时器类型及语法 /* 定时器: setTimeout 只执行一次的定时器 clearTimeout 关闭只执行 ...

  7. GridView 事件出发后 内容滚动条 实时定位

            var hh;         var hh1;         var h2; ///获取初始位置      触发事件  function Scroll() {            ...

  8. 图层 & 重排 & 重绘

    图层 浏览器在渲染一个页面时,会将页面分为很多个图层,图层有大有小,每个图层上有一个或多个节点 渲染 DOM 时 浏览器所做的: 获取 DOM 后分割为多个图层 对每个图层的节点计算样式结果 (Rec ...

  9. 解决ajax 跨域请求问题

    浏览器console报错: has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is 解决: 服务端加入代 ...

  10. java保留小数后两位的四种写法

    package com.btzh.mis.house.utils; import java.math.BigDecimal;import java.math.RoundingMode;import j ...