`

Spring中tx命名空间和配置注解工作原理浅析

 
阅读更多

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框架中,注解是实现依赖注入和配置的核心机制之一。本文将深入探讨Spring注解的基本原理,包括它们如何被解析、处理以及如何影响应用程序的生命周期。 首先,我们需要了解注解在Java语言中的本质。注解是一...

    spring中注解的实现原理

    本文将深入探讨Spring中注解的实现原理,帮助你更好地理解和运用这些核心概念。 首先,让我们从注解的基础知识开始。注解在Java中是一种元数据,它提供了在代码中嵌入信息的方式,而这些信息可以被编译器或运行时...

    spring-tx-5.0.0.0.RELEASE.jar_java开发_spring-tx-5.0.0_

    Spring TX是Spring框架中的事务抽象层,它为应用程序提供了声明式和编程式的事务管理。声明式事务管理是Spring的一个强大特性,允许开发者通过简单的注解或XML配置来控制事务边界,从而极大地简化了事务处理代码。...

    spring+springmvc+jpa零配置注解开发

    在“spring+springmvc+jpa零配置注解开发”项目中,我们将深入探讨如何利用注解驱动的配置,避免XML配置,实现更简洁、高效的开发流程。 首先,让我们关注“零配置”这个概念。在传统的Spring应用中,开发者需要在...

    spring配置文件----注解配置

    注解配置是Spring框架的一种简化配置手段,它允许开发者通过在类或方法上添加特定的注解,替代传统的XML配置文件,使得代码更加简洁且易于维护。 首先,我们需要理解Spring配置文件的作用。在早期的Spring版本中,...

    spring3零配置注解实现Bean定义

    标题《spring3零配置注解实现Bean定义》中蕴含的知识点主要包括Spring框架中的Bean定义配置方法的演进,特别是从Spring 2.5到Spring 3版本的过渡过程中,对于注解方式实现Bean定义的支持如何被引入和优化。...

    在非spring注解类中使用spring容器中的bean_普通类中使用yml配置文件中的配置信息

    虽然通常这个注解用于Spring管理的Bean,但也可以在非Spring管理的类中使用,只要确保配置的加载和绑定过程正确执行。 为了读取YAML配置,你需要在Spring Boot应用的启动类或者其他适当的初始化点,注册`@...

    spring-tx.rar

    在Spring-TX中,事务管理分为编程式和声明式两种方式: 1. 编程式事务管理:通过PlatformTransactionManager接口及其实现类,如DataSourceTransactionManager,可以在代码中手动开始、提交、回滚事务。这种方式灵活...

    Spring demo 自动检测注解

    本文将深入探讨Spring中的自动检测注解及其工作原理。 首先,`@Autowired`是Spring框架提供的一种依赖注入(DI,Dependency Injection)方式,用于自动装配bean的依赖。当我们在类的属性或方法上使用这个注解时,...

    Spring_tx事务

    本篇文章将深入探讨Spring事务管理的基础知识、工作原理以及如何在实际项目中应用。 首先,事务是数据库操作的基本单位,它确保了一组操作要么全部成功,要么全部失败,从而保证了数据的完整性和一致性。在Spring中...

    SpringSecurity笔记2-SpringSecurity命名空间

    - 理解Spring Security的命名空间不仅需要掌握配置语法,还建议查看源码以深入理解其工作原理。这有助于开发者更好地定制和调试安全配置。 - 使用IDE的代码导航和调试功能,可以帮助跟踪请求在过滤器链中的流程,...

    Struts2+spring注解配置

    Struts2 和 Spring 的整合是企业级 Java Web 开发中常见的技术栈,通过注解配置可以使项目更加简洁、易于维护。Struts2 提供了一种使用注解替代 XML 配置的方式,使得开发者无需编写繁琐的 struts.xml 文件,即可...

    Spring框架xml注解配置方式实例

    在本实例中,我们将深入探讨如何使用XML和注解结合的方式来配置Spring框架。首先,我们先来理解每个文件的作用。 1. **Maven配置文件pom.xml** Maven是一个项目管理工具,通过pom.xml文件来管理项目的构建、依赖和...

    Spring全注解project示例 (无web.xml配置)

    标题 "Spring全注解project示例 (无web.xml配置)" 提供了我们即将探讨的核心主题:一个使用Spring框架,完全依赖注解配置的项目,且没有传统的web.xml部署描述符。这种配置方式在现代Spring应用中非常常见,因为它...

    基于注解和Spring的多数据源配置和使用

    3. **使用`@Configuration`和`@Bean`注解**:在Spring配置类中,使用`@Configuration`注解标记该类为配置类,然后使用`@Bean`注解声明数据源对象。例如: ```java @Configuration public class DataSourceConfig ...

    spring3.x注解

    Spring 3.x 框架引入了依赖注入的注解,改变了传统的 XML 配置方式,提供了一种更加灵活和方便的依赖配置方式。下面对 Spring 3.x 的注解应用进行详细的介绍。 一、属性装配 在 Spring 3.x 中,提供了两种用于...

    spring 注解介绍

    Spring 2.0当中为缩减XML配置文件数量引入定制命名空间功能,从此它便深深植根于核心Spring框架(aop、context、jee、jms、 lang、tx和util命名空间)、Spring Portfolio项目(例如Spring Security)和非Spring项目...

    springmvc3+spring+mybatis3整合项目 注解实现

    这个整合项目是基于Spring 3.0.5、Spring MVC 3和MyBatis 3.0.2版本,采用注解方式进行配置,简化了XML配置文件,提高了开发效率。 Spring MVC是Spring框架的一部分,主要负责Web请求的处理。在本项目中,通过注解...

    spring mvc + spring + hibernate 全注解整合开发视频教程 04

    在本视频教程“Spring MVC + Spring + Hibernate 全注解整合开发视频教程 04”中,我们将深入探讨Java企业级开发中的三大核心技术——Spring、Spring MVC和Hibernate的集成与应用,尤其是通过注解实现的简化配置。...

Global site tag (gtag.js) - Google Analytics