- 浏览: 832820 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (363)
- 2010年3月 (3)
- 2010年4月 (3)
- Java (116)
- ExtJs (22)
- EJB3.0 (11)
- JQuery (28)
- SqlServer (5)
- Oracle (17)
- hibernate (21)
- struts2 (14)
- php (10)
- JavaScript (11)
- jbpm (6)
- spring (24)
- lucene (2)
- ibatis (7)
- C# (8)
- mysql (11)
- json (3)
- webservice (3)
- 设计模式 (1)
- jdbc (1)
- servlet (2)
- ice (6)
- 日常软件问题 (2)
- 生活 (2)
- iphone (1)
- rest (3)
- ruby (2)
- linux (13)
- quartz (1)
- poi (1)
- redis (13)
- memcached (4)
- nosql (2)
- tomcat调优 (1)
- 项目管理 (0)
最新评论
-
天使建站:
jquery里和数组相关的操作 附带具体的实例 ...
jquery对象数组 -
Cy0941:
$('#formId').form('submit',...) ...
easyui的form表单提交处理 -
shmily2038:
swifth 写道楼主,,你的命令写错啦,,[root@ser ...
centos直接yum安装nginx -
swifth:
楼主,,你的命令写错啦,,[root@server ~]# y ...
centos直接yum安装nginx -
随遇而安DXX:
...
REST
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扫描功能:
Xml代码
<context:component-scan base-package="com.ronry.springtest.simple" />
<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,设置的方法稍有不同。
提供自动扫描功能的核心类是: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扫描功能:
Xml代码
<context:component-scan base-package="com.ronry.springtest.simple" />
<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,设置的方法稍有不同。
发表评论
-
spring mvc自动绑定数据到对象
2012-11-05 12:33 1702yxb1990 写道 dancewing 写道 ... -
Spring2.5.6+Struts2.1.6+Hibernate3.2升级到Spring3.1.3+Struts2.3.4+Hibernate3.6Final
2012-11-02 19:50 16281. Struts2.3.4相对于Struts2. ... -
Spring事务配置的五种方式
2012-10-03 22:15 1149前段时间对Spring的事务配置做了比较深入的研究,在此之间 ... -
spring相关配置
2012-09-06 09:05 1145<!-- spring编码过滤器 --> ... -
JAXB “Class has two properties of the same name” issue
2012-08-24 16:53 1413@XmlRootElement(name = "Re ... -
spring注解
2012-06-04 17:34 837spring注解,如果没有设置名称,则默认以你所注解的类的名称 ... -
spring mvc 3.x输出xml或者json
2012-03-11 23:37 2854方式一: 参考: [url] http://www.mkyo ... -
Spring 2.5 jar 所有开发包及完整文档及项目开发实例
2011-08-06 18:29 2910Spring 2.5 jar 所有开发包及完整文档及项目开发实 ... -
jms
2011-07-29 21:54 15651 引言 1.1 编写目的 本文作为B2bi项目中开源产品JO ... -
spring jms
2011-07-29 00:41 16101. 概述:Spring提供了一个用于简化JMS API使用的 ... -
jms
2011-07-29 00:06 1071当前,CORBA、DCOM、RMI等RPC中间件技术已广泛应用 ... -
spring jms
2011-07-27 11:19 2945JMS简介:一种应用于异步消息传递的标准API,JMS也是应用 ... -
spring定时器用Annotation实现
2011-07-09 15:34 1987通过 注解 来调度任务 1、AnnotationQuartz ... -
java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream
2011-07-07 17:41 1899Exception in thread "main& ... -
spring各种邮件发送
2011-07-07 17:14 1235Spring邮件抽象层的主要包为org.springframe ... -
spring sercurity
2011-07-05 11:04 1289http://www.blogjava.net/redhatl ... -
spring事物
2011-07-04 09:19 1447事务 ( acid ) atomic : 原子性 ,有多个 ... -
spring bean scope
2011-07-01 14:39 1108在spring的配置文件中bean的范围控制用scope来控制 ... -
Spring 框架的设计理念与设计模式分析
2011-06-03 15:18 945http://www.ibm.com/developerwor ... -
spring aop
2011-04-03 07:46 1305Spring中代理类的生成 ...
相关推荐
通过分析这个示例,你可以更好地理解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 @...