一 解析类
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. BZOJ4259 残缺的字符串 多项式 FFT

    原文链接http://www.cnblogs.com/zhouzhendong/p/8798532.html 题目传送门 - BZOJ4259 题意 给你两个串,用其中一个来匹配另一个.问从母串的那些 ...

  2. Django——发送邮件

    Django--发送邮件 在web应用中,服务器对客户发送邮件来通知用户一些信息,可以使用邮件来实现. Django中提供了邮件接口,使我们可以快捷的建设一个邮件发送系统. 以下是一个简单实例: se ...

  3. PHP文件上传大小限制问题

    一.Thinkphp方面限制  $upload->maxSize   =     31457280 ; //设置附件上传大小 二.七牛方面限制: 'UPLOAD_FILE_QINIU' => ...

  4. NOIP-Cantor表

    题目描述 现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的.他是用下面这一张表来证明这一命题的: 我们以Z字形给上表的每一项编号.第一项是1/1,然后是1/2,2/1,3/1,2 ...

  5. nagios的安装与部署

    参考文献: https://www.cnblogs.com/mchina/archive/2013/02/20/2883404.html https://www.jianshu.com/p/3476d ...

  6. laravel之ORM增删改查数据

    1.首先在控制器中添加方法,然后添加路由,接着在模型中操作: 以下是模型 2.以下是控制器中的操作 一下是通过ORM进行更新 删除数据

  7. java学习(五)--- 方法

    方法的定义 修饰符 返回值类型 方法名(参数类型 参数名){ ... 方法体 ... return 返回值; } 注意:非void方法必须有返回值 方法重载: 可以声明方法相同,但是参数类型不同的方法 ...

  8. linux安装zookeeper

    安装环境:Linux:centos6.4Jdk:1.7以上版本 Zookeeper是java开发的可以运行在windows.linux环境.需要先安装jdk.安装步骤:第一步:安装jdk第二步:把zo ...

  9. ASP.NET Core 从 gitlab-ci 环境变量读取配置

    最近在加强持续集成,遇到一个场景需要通过 gitlab-ci 环境变量(Settings -> Settings -> CI/CD -> Variables )在持续集成时向 ASP ...

  10. 【Python基础】lpthw - Exercise 40 模块、类和对象

    一. 模块(module) 模块中包含一些函数和变量,在其他程序中使用该模块的内容时,需要先将模块import进去,再使用.操作符获取函数或变量,如 # This goes in mystuff.py ...