Spring中tx命名空间和配置注解工作原理浅析
在使用Spring时,对于一些功能的配置可以通过Spring提供的XML命名空间进行配置,也可以通过提供的注解进行配置。这两种方式都是等价的,它们背后对应的工作原理是什么呢?
以事务管理为例:(以下代码来自Spring的API文档)
@EnableTransactionManagement注解启用了事务管理功能。
@Configuration @EnableTransactionManagement public class AppConfig { @Bean public FooRepository fooRepository() { // configure and return a class having @Transactional methods return new JdbcFooRepository(dataSource()); } @Bean public DataSource dataSource() { // configure and return the necessary JDBC DataSource } @Bean public PlatformTransactionManager txManager() { return new DataSourceTransactionManager(dataSource()); } }
上面的代码与以下的XML配置是等效的:
<beans> <tx:annotation-driven/> <bean id="fooRepository" class="com.foo.JdbcFooRepository"> <constructor-arg ref="dataSource"/> </bean> <bean id="dataSource" class="com.vendor.VendorDataSource"/> <bean id="transactionManager" class="org.sfwk...DataSourceTransactionManager"> <constructor-arg ref="dataSource"/> </bean> </beans>
一、XML配置工作机制
那类似于“<tx:annotation-driven/>”的配置是如何生效的呢?以启动ClassPathXmlApplicationContext为例。
装载Bean部分过程如下:
1. ClassPathXmlApplicationContex构造函数中自动调用refresh()完成Bean信息的装载(除非显示指定,手工刷新):
2. ApplicationContext通过XmlBeanDefinitionReader来读取和解析XML文件。
3. XmlBeanDefinitionReader通过DefaultBeanDefinitionDocumentReader来读取XML中定义的Bean信息,并保存到BeanDefinitionRegistry中。
4. 对于默认命名空间中的XML标签通过parseDefaultElement()来进行解析。支持的XML标签有:import、alias、bean和beans,其他标签都会被忽略。
5. 对于其他命名空间中的标签,使用DefaultNamespaceHandlerResolver来获取对应的NamespaceHandler,完成标签的解析。NamespaceHandler相关的配置信息放在Spring的jar包中的” META-INF/spring.handlers”路径下。
由此可见,当XML中存在“<tx:annotation-driven/>”时,命名空间为tx,从配置文件中查找到的NamespaceHandler为TxNamespaceHandler。由TxNamespaceHandler负责具体的解析工作,它的部分代码如下:
public void init() { registerBeanDefinitionParser("advice", new TxAdviceBeanDefinitionParser()); registerBeanDefinitionParser("annotation-driven", new AnnotationDrivenBeanDefinitionParser()); registerBeanDefinitionParser("jta-transaction-manager", new JtaTransactionManagerBeanDefinitionParser()); }
由代码可见,tx命名空间只支持”advice”、”annotation-driven”和"jta-transaction-manager"三个Bean定义。
一、注解配置的工作原理
@EnableTransactionManagement注解又是如何起作用的呢?
1. ApplicationContex调用refresh()中,首先刷新BeanFactory完成PostProcessor监听器的注册,其中就有ConfigurationClassPostProcessor,用来解析与@Configuration注解同时出现的注解信息。
2. 调用所有的BeanFactoryPostProcessor,其中ConfigurationClassPostProcessor对BeanFactory中所有的bean定义进行检查,对标注了@Configuration的Bean使用ConfigurationClassParser进行解析。
3. Parser解析包括:1)对Member成员的递归解析;2)检查Bean定义中的注解:@PropertySourc、@ComponentScan、@Import、@ImportResource、@Bean,以及对超类进行检查。记录相关的注解信息。
4. 在生成Bean实例前,调用相关的BeanPostProcessor,其中一步处理是为Bean找到相关的Advisor,完成切面的“编织”工作
相关推荐
这是对Spring中注解是怎么实现的一个大概基本原理,条件是采取的理想状态,所以代码中还有缺陷的话请谅解,如果有需要的朋友可以放心下载,里面有详细的解释和流程。相信你能看懂
开发工具 spring-tx-4.3.6.RELEASE开发工具 spring-tx-4.3.6.RELEASE开发工具 spring-tx-4.3.6.RELEASE开发工具 spring-tx-4.3.6.RELEASE开发工具 spring-tx-4.3.6.RELEASE开发工具 spring-tx-4.3.6.RELEASE开发工具...
spring各种命名空间实例。以及命名空间下的各元素简介
spring+springmvc+jpa零配置注解开发 不需要在xml中配置任何东西
spring-tx-5.0.0.0.RELEASE.jar是一个jar包,是项目额依赖文件,可以下载直接引入项目使用
赠送jar包:spring-tx-5.2.0.RELEASE.jar; 赠送原API文档:spring-tx-5.2.0.RELEASE-javadoc.jar; 赠送源代码:spring-tx-5.2.0....人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
赠送jar包:spring-tx-5.3.10.jar; 赠送原API文档:spring-tx-5.3.10-javadoc.jar; 赠送源代码:spring-tx-5.3.10-sources.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
Spring 2.0当中为缩减XML配置文件数量引入定制命名空间功能,从此它便深深植根于核心Spring框架(aop、context、jee、jms、 lang、tx和util命名空间)、Spring Portfolio项目(例如Spring Security)和非Spring项目...
赠送jar包:spring-tx-4.3.12.RELEASE.jar; 赠送原API文档:spring-tx-4.3.12.RELEASE-javadoc.jar; 赠送源代码:spring-tx-4.3.12....人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
赠送jar包:spring-tx-5.1.3.RELEASE.jar; 赠送原API文档:spring-tx-5.1.3.RELEASE-javadoc.jar; 赠送源代码:spring-tx-5.1.3....人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
NULL 博文链接:https://zxf-noimp.iteye.com/blog/1071765
本文档介绍了spring中的在classpath中加载配置文件
配置整合DWR3.0和Spring2.5使用annotation注解
Spring java注解,元注解和自定义注解 Spring java注解,元注解和自定义注解 Spring java注解,元注解和自定义注解 Spring java注解,元注解和自定义注解 Spring java注解,元注解和自定义注解
spring mvc + spring + hibernate 全注解整合开发视频教程 06.haozip03
赠送jar包:spring-tx-5.0.8.RELEASE.jar; 赠送原API文档:spring-tx-5.0.8.RELEASE-javadoc.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。 双语对照,边学技术、边学英语。
赠送jar包:spring-tx-5.3.15.jar; 赠送原API文档:spring-tx-5.3.15-javadoc.jar; 赠送源代码:spring-tx-5.3.15-sources.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
NULL 博文链接:https://lym6520.iteye.com/blog/309169
赠送jar包:spring-tx-5.0.10.RELEASE.jar; 赠送原API文档:spring-tx-5.0.10.RELEASE-javadoc.jar; 赠送源代码:spring-tx-5.0.10....人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
赠送jar包:spring-tx-4.2.2.RELEASE.jar; 赠送原API文档:spring-tx-4.2.2.RELEASE-javadoc.jar; 赠送源代码:spring-tx-4.2.2....人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。