我不加 EnableTransactionManagement也能使用Transactional?

1,120 阅读2分钟

EnableTransactionManagement自动开启的原因?

  1. 在springboot中有很多自动配置类,特别是启动类里的@SpringBootApplication这个注解集成了许多自动化配置
  2. 在服务启动时候,如果没有手动开启 @EnableTransactionManagement,会通过@SpringBootApplication注解自动的把@EnableTransactionManagement加载进ioc容器里

服务模块从哪里拉取?

  1. 点击SpringBootApplication注解进入,可以看到@EnableAutoConfiguration注解,继续点击这个注解进入到里面

  2. 如下图片,@Import注解,会从服务启动时会把 AutoConfigurationImportSelector这个类注入进IOC里,我们在点击进入这个类看一下是什么。。

  3. 它其实是一个加载类,里面封装了很多自动化配置的引用,通过导入这个类,间接把这些连接到这个类的配置类都注入到IOC里了。往下走,点击进入SpringFactoriesLoader.loadFactoryNames()方法,

  4. 可以看到启动时候调用的链路,最终会找到这个类META-INF/spring.factories进行加载

  1. 下一步会调用META-INF/spring.factories里的所有全类名的路径下的类进行加载,spring.factories里面有很多配置文件,篇幅原因,这里只讲解关于事务的,其他的配置有兴趣的铁子们可以自己看看。。。

加载TransactionAutoConfiguration模块

  1. 找到对应的包下的类
  2. 点击进去,发现这个类其实就是一个配置加载类,里面有几个方法,方法上都有@ConditionalOnMissingBean这个注解,它表示当xxx类不存在时候就加载当前方法里的数据。@Conditional这个注解是一个条件表达式,它有很多兄弟。都是表示XXX不存在或者XXX存在时候需要做什么,类似代码里的if-else

总结

  1. springboot启动后会加载@SpringBootApplication这个类,通过这个类加载AutoConfigurationImportSelector这个类,然后找到事务的类进行加载。

  2. 需要导入spring-tx事务的包才会加载。

  3. 注意看最后一张图里的@EnableTransactionManagement注解,我们自己开启事务时候会写这个注解的,也就是说,如果不写这个注解,默认服务启动会加载这个类,如果写了,就不加载这个类了。