当前位置: 首页 > ds >正文

springBoot如何加载类(以atomikos框架中的事务类为例)

最近在研究多数据源事务框架atomikos如何使用,但是很容易和单数据源事务框架发生加载冲突。于是就研究了一下springBoot如何加载类。

springBoot加载步骤。

一、自动装配入口
spring-boot-autoconfigure.jar/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 这个文件中加载所有的Configuration。
二、以TransactionAutoConfiguration类为例

这个类中有3个注解: 

@AutoConfiguration(after = { JtaAutoConfiguration.class, HibernateJpaAutoConfiguration.class,DataSourceTransactionManagerAutoConfiguration.class, Neo4jDataAutoConfiguration.class })
@ConditionalOnClass(PlatformTransactionManager.class)
@EnableConfigurationProperties(TransactionProperties.class)
public class TransactionAutoConfiguration {
...
}

@AutoConfiguration:声明当前类是一个自动装配类,并且在指定它必须在某些其他自动装配类加载完成之后才会执行。

@ConditionalOnClass:如果类路径下是否存在PlatformTransactionManager类。如果存在那么加载被注解的配置或Bean,否则不加载。很显然PlatformTransactionManager类是springBoot基础包中的类,所以当前类一定被加载。

@EnableConfigurationProperties:一般来说TransactionProperties类上方还有一个注解@ConfigurationProperties(prefix = "spring.transaction")用于定义类字段和配置文件的映射。@EnableConfigurationProperties用于激活属性绑定,并注册属性类为 Bean。在其他类中可以直接引用注入,比如:

@Autowiredprivate TransactionProperties properties; // 直接注入配置

按照加载顺序,需要先加载after后面的类,以JtaAutoConfiguration类为例继续。

三、以JtaAutoConfiguration类为例
@AutoConfiguration(before = { XADataSourceAutoConfiguration.class, ActiveMQAutoConfiguration.class,ArtemisAutoConfiguration.class, HibernateJpaAutoConfiguration.class })
@ConditionalOnClass(javax.transaction.Transaction.class)
@ConditionalOnProperty(prefix = "spring.jta", value = "enabled", matchIfMissing = true)
@Import({ JndiJtaConfiguration.class, AtomikosJtaConfiguration.class })
public class JtaAutoConfiguration {}

从代码中可以看出加载这个类的条件是:类路径下存在Transaction类,并且spring.jta.enabled=true或者没有这个配置。
所有JtaAutoConfiguration类一定会被加载。

这个类在加载的同时还加载了这两个类:

JndiJtaConfiguration 和 AtomikosJtaConfiguration
四、以AtomikosJtaConfiguration类为例
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties({ AtomikosProperties.class, JtaProperties.class })
@ConditionalOnClass({ JtaTransactionManager.class, UserTransactionManager.class })
@ConditionalOnMissingBean(org.springframework.transaction.TransactionManager.class)
class AtomikosJtaConfiguration {@Bean(initMethod = "init", destroyMethod = "shutdownWait")@ConditionalOnMissingBean(UserTransactionService.class)UserTransactionServiceImp userTransactionService(AtomikosProperties atomikosProperties,JtaProperties jtaProperties) {Properties properties = new Properties();if (StringUtils.hasText(jtaProperties.getTransactionManagerId())) {properties.setProperty("com.atomikos.icatch.tm_unique_name", jtaProperties.getTransactionManagerId());}properties.setProperty("com.atomikos.icatch.log_base_dir", getLogBaseDir(jtaProperties));properties.putAll(atomikosProperties.asProperties());return new UserTransactionServiceImp(properties);}
........
}

加载这个自动装配类的条件是:类路径中存在这两个类:JtaTransactionManager和UserTransactionManager,并且spring容器中没有 TransactionManager对象。

加载类时,也根据配置信息实例化了AtomikosProperties和JtaProperties。

自动装配时会实例化UserTransactionServiceImp类,同时会调用这个类的init()方法。在这个方法中就能看到相应的业务逻辑了。

五、其他疑问

Q:AtomikosJtaConfiguration类是springBoot基础包中的类,却引入了atomikos jar中的类(比如:UserTransactionManager)。如果我的项目中只引入了springBoot基础包,但是没有引入atomikos jar,我的项目为什么没有编译报错?

A:自动配置类通常通过 @ConditionalOnClass 注解来控制是否生效。如果项目中未引入 Atomikos 相关的依赖, @ConditionalOnClass 会阻止该配置类的加载。

Q:编译时为什么没有报错?

A:编译时,Java 编译器只会检查类路径中是否存在类的引用,但不会强制要求所有引用的类都必须存在。

运行时,如果尝试加载一个不存在的类,才会抛出 ClassNotFoundException 。

http://www.xdnf.cn/news/18859.html

相关文章:

  • MIT 6.5840 (Spring, 2024) 通关指南——入门篇
  • MYSQL-表的约束(下)
  • 【机器学习】5 Bayesian statistics
  • 46.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--扩展功能--集成网关--网关集成日志
  • 前端漏洞(上)- Django debug page XSS漏洞(漏洞编号:CVE-2017-12794)
  • 【C++组件】ODB 安装与使用
  • 春秋云镜 TOISEC 部分WP
  • 3.1 存储系统概述 (答案见原书 P149)
  • 鸿蒙中Frame分析
  • NLP:Transformer各子模块作用(特别分享1)
  • 网络编程socket-Udp
  • 互联网大厂Java面试模拟:深度解析核心技术
  • 100个实用小工具1.3历年股价分析小工具新增股价批量下载
  • 使用UE5开发2.5D开放世界战略养成类游戏的硬件配置指南
  • 电子厂静电释放检测误报率↓81%!陌讯多模态融合算法在安全生产监控的落地实践
  • imx6ull-驱动开发篇38——Linux INPUT 子系统
  • MATLAB 数值计算进阶:微分方程求解与矩阵运算高效方法
  • 从 Unity UGUI 到 Unreal UMG 的交互与高效实践:UI 事件、坐标系适配与性能优化
  • WinContig:高效磁盘碎片整理工具
  • 基于蓝牙的stm32智能火灾烟雾报警系统设计
  • Golang云端编程入门指南:前沿框架与技术全景解析
  • 访问控制基础与模型综述
  • Python自学笔记11 Numpy的索引和切片
  • Sui 主网升级至 V1.54.2
  • Lucene 与 Elasticsearch:从底层引擎到分布式搜索平台的演进
  • 虚幻引擎5(UE5)Android端游戏开发全流程指南:从环境配置到项目发布
  • Spring Boot测试陷阱:失败测试为何“传染”其他用例?
  • 在PC机上使用虚幻引擎5(UE5)开发第一款游戏的完整入门指南
  • HTTP请求中的CGI请求与登录注册机制
  • Golang云端编程深度指南:架构本质与高阶实践