`
ronry
  • 浏览: 39357 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

spring bean自动扫描分析

阅读更多

     Spring为企业级开发提供了轻量而又强大的支持。但是为了使用spring还是需要大量的配置文件对系统中的bean进行配置。虽然提供了基于注解的配置,但其也只能省去依赖部分的配置,而对每个Bean本身的配置仍然需要。为了进一步减少配置,Spring进一步提供了从classpath自动扫描Bean组建并将其对应的BeanDefinination加入到容器中的功能。本文就对spring自动扫描组建的功能进行学习和分析。

   提供自动扫描功能的核心类是:ClassPathBeanDefinitionScanner,该类根据提供个基础包名,扫描classpath下与该包名的路径下,找到复合条件的类并注册为Spring的一个Bean 默认情况下,ClassPathBeanDefinitionScanner将会扫面所有用Spring指定了的注解标识了的类,包括:@Component@Service@Repository@Controller(Spring注解配置的详细内容可以参见http://www.ibm.com/developerworks/cn/opensource/os-cn-spring-iocannt/)。也可以对扫描的机制进行配置,设置一些Filter,只有满足Filter的类才能被注册为Bean

     有两种方式使用Classpath扫描机制:第一种是直接使用AnnotationConfigApplicationContext,该类有一个scan(String basePackages)方法,可以对指定的包进行扫描;第二种是在Bean配置文件中使用如下配置开启classpath扫描功能:

 

<context:component-scan base-package="com.ronry.springtest.simple" />

 

 (注意需要配置context命名空间)。开启扫描功能之后即可按普通的方式从配置文件创建一个ApplicationContext。在ApplicationContextloadBeanDefinition时遇到component-scan元素时会以ComponentScanBeanDefinitionParser进行解析。

    AnnotationConfigApplicationContextComponentScanBeanDefinitionParser,内部依赖的都是ClassPathBeanDefinitionScanner。与其相关的主要类如下:


    ResourcePatternResolver用来从classpath中加载ResourceMetadataReaderFactory用来根据Resource生成MetadataReaderBeanNameGenerator用来生成扫描到的Bean在容器中的名字;ScopeMetadataResolver则用来处理扫描到的BeanScope。其中需要特别注意的是BeanNameGeneratorScopeMetadataResolver是可配置的,在ComponentScanBeanDefinitionParser中有两个方法:parseBeanNameGenerator(element, scanner)parseScope(element, scanner)就是用来处理这两个组件的配置的。如果没有配置,则BeanNameGenerator默认是用AnnotationBeanNameGeneratorScopeMetadataResolver用的是AnnotationScopeMetadataResolver

         而扫描的过程大概为:

  1. ResourcePatternResolver从配置的classpath中加载Resource
  2. 分别处理扫描到的每个Resource,用MetadataReaderFactory生成对应的MetadataReader;
  3. 根据MetadataReader判断Resource是否是符合条件的Component;
  4. 如果是,则生成对应的ScannedGenericBeanDefinition;不是则跳过;
  5. 对于经过上面4步生成的符合条件的ScannedGenericBeanDefinition,先用ScopeMetadataResolver生成ScopeMetadata,将得到的Scope设置到对应的ScannedGenericBeanDefinition中;
  6. 再用BeanNameGenerator生成Bean的名称;
  7. 最后,设置ScannedGenericBeanDefinition的其他属性,例如:dependsOn、lazy、autowired等;根据ScannedGenericBeanDefinition是AbstractBeanDefinition还是AnnotatedBeanDefinition,设置的方法稍有不同。

 

  • 大小: 55.5 KB
分享到:
评论

相关推荐

    spring自动扫描和管理Bean的示例

    spring自动扫描和管理Bean的示例

    Spring自动扫描无法扫描jar包中bean的解决方法

    在日常开发中往往会对公共的模块打包发布,然后调用公共包的内容。...spring却无法扫描到相应的bean,下面这篇文章主要给大家介绍了关于Spring自动扫描时无法扫描jar包中bean的解决方法,需要的朋友可以参考下。

    Spring学习笔记(9)----让Spring自动扫描和管理Bean

    NULL 博文链接:https://coolszy.iteye.com/blog/519448

    浅谈Spring装配Bean之组件扫描和自动装配

    本篇文章主要介绍了浅谈Spring装配Bean之组件扫描和自动装配,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    让spring解决控制springboot中bean的加载顺序的问题.docx

    只需要把需要注册进容器的bean声明为@Component即可,spring会自动扫描到这个Bean完成初始化并加载到spring上下文容器。 而当你在项目启动时需要提前做一个业务的初始化工作时,或者你正在开发某个中间件需要完成...

    基于框架的Web开发-装配Bean自动装配.doc

    组件扫描(component scanning):Spring会自动发现应用上下文中所创建的bean。 自动装配(autowiring):Spring自动满足bean之间的依赖。 1 使用@Component定义bean 在类声明的前面使用@Component对类进行标注,这...

    Spring组件自动扫描详解及实例代码

    Spring组件自动扫描详解及实例代码 问题描述 一个系统往往有成千上万的组件,如果需要手动将所有组件都纳入spring容器中管理,是一个浩大的工程。 解决方案 Spring 提供组件扫描(component scanning)功能。它能...

    spring2.5学习PPT 传智博客

    让Spring自动扫描和管理Bean 15.使用JDK中的Proxy技术实现AOP功能 16.使用CGLIB实现AOP功能与AOP概念解释 17.使用Spring的注解方式实现AOP入门 18.使用Spring的注解方式实现AOP的细节 19.使用Spring配置文件...

    springboot编译jar包后无法扫描子jar包中的注解解决方法

    springboot 项目编译后无法扫描加载到子jar包中的注解解决方法

    spring+springmvc+mybatis的整合

    2.6 spring-bean 配置mapper自动扫描 MapperScannerConfigurer将扫描basePackage所指定的包下的所有接口类(包括子类), 如果它们在SQL映射文件中定义过,则将它们动态定义为一个Spring Bean, 这样,我们在...

    Spring in action 实战中文版(第4版)目录修复版

    2.2 自动化装配bean 35 2.2.1 创建可被发现的bean 35 2.2.2 为组件扫描的bean命名 38 2.2.3 设置组件扫描的基础包 39 2.2.4 通过为bean添加注解实现自动装配 40 2.2.5 验证自动装配 42 2.3 通过Java代码装配 ...

    resteasy-spring-boot:RESTEasy Spring Boot Starter

    另外,此RESTEasy Spring Boot启动程序将按预期方式与Spring集成,这意味着每个也是Spring Bean的JAX-RS REST资源都将被自动自动扫描,集成和可用。 产品特点 为Spring Boot应用程序启用RESTEasy 作为Spring bean...

    从零开始学Spring Boot

    1.29 改变自动扫描的包 1.30 Spring Boot Junit单元测试 1.31 SpringBoot启动时的Banner设置 1.32 Spring boot 文件上传(多文件上传) 1.33 导入时如何定制spring-boot依赖项的版本 1.34 Spring Boot导入XML配置 ...

    springjdbc

    -- 自动扫描bean,把作了注解的类转换为bean --&gt; &lt;context:component-scan base-package="com.test.controller" /&gt; &lt;!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 --&gt; &lt;bean class="org.spring...

    华为技术专家整理Spring Boot 注解大全.docx

    @ComponentScan 组件扫描,可自动发现和装配一些 Bean。 @Component 可配合 CommandLineRunner 使用,在程序启动后执行一些基础任务。 @RestController 注解是 @Controller 和 @ResponseBody 的合集, 表示这是个...

    resteasy-spring-boot

    另外,此RESTEasy Spring Boot启动程序将按预期方式与Spring集成,这意味着每个也是Spring Bean的JAX-RS REST资源都将被自动自动扫描,集成和可用。 特征 为Spring Boot应用程序启用RESTEasy 作为Spring bean支持...

    Spring中文帮助文档

    7.9.1. 自动代理bean定义 7.9.2. 使用元数据驱动的自动代理 7.10. 使用TargetSource 7.10.1. 热交换目标源 7.10.2. 池化目标源 7.10.3. 原型目标源 7.10.4. ThreadLocal目标源 7.11. 定义新的Advice类型 ...

    Spring Boot 注解

    一 、注解列表 @SpringBootApplication: 包含了@ComponentScan、@Configuration和@EnableAutoConfiguration注解。...@ComponentScan: 组件扫描,可自动发现和配置一些Bean。 @Component: 可配合CommandLineRu

Global site tag (gtag.js) - Google Analytics