EnableTransactionManagement自动开启的原因?
- 在springboot中有很多自动配置类,特别是启动类里的@SpringBootApplication这个注解集成了许多自动化配置
- 在服务启动时候,如果没有手动开启 @EnableTransactionManagement,会通过@SpringBootApplication注解自动的把@EnableTransactionManagement加载进ioc容器里
服务模块从哪里拉取?
-
点击SpringBootApplication注解进入,可以看到@EnableAutoConfiguration注解,继续点击这个注解进入到里面
-
如下图片,@Import注解,会从服务启动时会把 AutoConfigurationImportSelector这个类注入进IOC里,我们在点击进入这个类看一下是什么。。
-
它其实是一个加载类,里面封装了很多自动化配置的引用,通过导入这个类,间接把这些连接到这个类的配置类都注入到IOC里了。往下走,点击进入SpringFactoriesLoader.loadFactoryNames()方法,
- 下一步会调用META-INF/spring.factories里的所有全类名的路径下的类进行加载,spring.factories里面有很多配置文件,篇幅原因,这里只讲解关于事务的,其他的配置有兴趣的铁子们可以自己看看。。。
加载TransactionAutoConfiguration模块
- 找到对应的包下的类
- 点击进去,发现这个类其实就是一个配置加载类,里面有几个方法,方法上都有@ConditionalOnMissingBean这个注解,它表示当xxx类不存在时候就加载当前方法里的数据。@Conditional这个注解是一个条件表达式,它有很多兄弟。都是表示XXX不存在或者XXX存在时候需要做什么,类似代码里的if-else
总结
-
springboot启动后会加载@SpringBootApplication这个类,通过这个类加载AutoConfigurationImportSelector这个类,然后找到事务的类进行加载。
-
需要导入spring-tx事务的包才会加载。
-
注意看最后一张图里的@EnableTransactionManagement注解,我们自己开启事务时候会写这个注解的,也就是说,如果不写这个注解,默认服务启动会加载这个类,如果写了,就不加载这个类了。