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。在ApplicationContext的loadBeanDefinition时遇到component-scan元素时会以ComponentScanBeanDefinitionParser进行解析。
但AnnotationConfigApplicationContext和ComponentScanBeanDefinitionParser,内部依赖的都是ClassPathBeanDefinitionScanner。与其相关的主要类如下:
ResourcePatternResolver用来从classpath中加载Resource;MetadataReaderFactory用来根据Resource生成MetadataReader;BeanNameGenerator用来生成扫描到的Bean在容器中的名字;ScopeMetadataResolver则用来处理扫描到的Bean的Scope。其中需要特别注意的是BeanNameGenerator和ScopeMetadataResolver是可配置的,在ComponentScanBeanDefinitionParser中有两个方法:parseBeanNameGenerator(element,
scanner)和parseScope(element, scanner)就是用来处理这两个组件的配置的。如果没有配置,则BeanNameGenerator默认是用AnnotationBeanNameGenerator而ScopeMetadataResolver用的是AnnotationScopeMetadataResolver。
而扫描的过程大概为:
-
用ResourcePatternResolver从配置的classpath中加载Resource;
- 分别处理扫描到的每个Resource,用MetadataReaderFactory生成对应的MetadataReader;
- 根据MetadataReader判断Resource是否是符合条件的Component;
- 如果是,则生成对应的ScannedGenericBeanDefinition;不是则跳过;
- 对于经过上面4步生成的符合条件的ScannedGenericBeanDefinition,先用ScopeMetadataResolver生成ScopeMetadata,将得到的Scope设置到对应的ScannedGenericBeanDefinition中;
- 再用BeanNameGenerator生成Bean的名称;
- 最后,设置ScannedGenericBeanDefinition的其他属性,例如:dependsOn、lazy、autowired等;根据ScannedGenericBeanDefinition是AbstractBeanDefinition还是AnnotatedBeanDefinition,设置的方法稍有不同。
- 大小: 55.5 KB
分享到:
相关推荐
通过分析这个示例,你可以更好地理解Spring自动扫描和管理Bean的工作原理,以及如何在实际项目中应用这些概念。 总结起来,Spring的自动扫描和管理Bean功能是通过组件扫描和注解驱动配置实现的,这大大减少了手动...
自动扫描是Spring框架的一个强大功能,它允许开发者指定一个或多个包,Spring会自动查找这些包及其子包下的所有带有特定注解(如@Component、@Service、@Repository、@Controller等)的类,然后将这些类注册为bean。...
在Spring框架中,自动扫描和管理Bean是一种便捷的方式,它允许开发者无需显式配置每个Bean,而是通过指定包路径来让Spring自动发现和管理Bean。本文将深入探讨这个主题,帮助你更好地理解和应用这一功能。 首先,让...
在Spring框架中,自动扫描(Auto-Component Discovery)是一个便捷的功能,它允许开发者无需显式配置每个Bean,而是通过指定包名让Spring自动发现并管理Bean。然而,当Bean定义在独立的jar包中,有时Spring可能无法...
`@Component`注解的类会自动被Spring扫描并注册为Bean,而`@Configuration`类则提供了更高级别的配置方式,可以替代XML配置文件。 此外,Spring提供了一种名为BeanPostProcessor的接口,它允许我们自定义Bean实例化...
- `byType`:如果Bean的属性类型只有一个匹配的Bean,那么Spring会自动注入。 `@Autowired`注解则更加智能,它会根据属性类型找到合适的Bean进行注入,如果存在多个匹配的Bean,可以通过`@Qualifier`注解指定特定的...
通过对这些示例的分析,我们可以深入理解Spring 2.5中的自动扫描classpath是如何工作的,以及它如何与AOP、数据源管理、依赖注入、bean作用域等核心概念相结合,构建出高效灵活的Java应用。通过阅读源码和实践这些...
Spring 自动扫描注入机制 Spring 框架为开发者提供了自动扫描注入机制,使得组件的管理变得更加简洁高效。在 Spring 2.5 中,引入了组件自动扫描机制,该机制可以在类路径下寻找标注了 @Component、@Service、@...
在Spring框架中,自动扫描(Auto-Component Discovery)是一种便捷的方式,它允许开发者无需显式配置每个bean,就能将类路径下(classpath)的特定包及其子包中的组件(即带有特定注解的类)纳入Spring容器进行管理...
我们可以创建一个配置类,然后在其中声明bean,使用`@ComponentScan`扫描包含普通类的包,这样Spring就能自动管理普通类。同时,也可以在配置类中使用`@Bean`注解创建bean实例,然后在普通类中通过`@Autowired`注入...
这些注解简化了Bean的声明,使得Spring可以通过扫描包路径自动发现和注册Bean。 对于依赖注入,Spring提供了`@Autowired`注解,它可以根据类型或者通过`@Qualifier`指定名称来自动装配Bean。此外,`@Value`注解可以...
- **通过代码注解**:Spring也支持通过注解来获取Bean,如`@Autowired`和`@Resource`,它们能够自动将依赖注入到目标字段或方法中,无需手动从ApplicationContext获取。 3. **静态Singleton Bean Manager** 通常...
- **自动扫描组件**:Spring 可以自动发现并注册带有特定注解(如 `@Component`)的类。 6. **实例化与初始化**: - **实例化**:Spring 根据 BeanDefinition 创建 Bean 实例,可能涉及构造器注入和属性设置。 -...
标记了这些注解的类会被Spring扫描并纳入bean管理。 3. **@Autowired注解**: 这个注解用于自动注入bean。当你在类的属性或方法上添加@Autowired,Spring会尝试查找匹配类型的bean并注入。 4. **...
1. **无注解自动装配(No Annotation Auto-Wiring)**:在XML配置文件中,通过`<context:component-scan>`元素扫描指定包下所有的类,将它们声明为bean,并尝试自动装配。这种方式默认是按类型匹配,如果存在多个...
1. 自动扫描:Spring Boot可以通过`@ComponentScan`注解自动扫描特定包及其子包下的所有`@Component`家族注解的类。在启动类上添加此注解,Spring会自动发现并注册这些Bean。 ```java @SpringBootApplication @...