概述
HibernateJpaAutoConfiguration 是Spring Boot针对使用JPA + Hibernate的自动配置类,它的主要目的是在特定条件被满足的情况下导入配置类HibernateJpaConfiguration。关于运行时使用的JPA + Hibernate组件的真正的配置工作,被委托给了HibernateJpaConfiguration来完成。
HibernateJpaAutoConfiguration导入HibernateJpaConfiguration的特定条件是 :
- 类
LocalContainerEntityManagerFactoryBean和EntityManager必须存在于classpath; - 条件
HibernateEntityManagerCondition必须被满足;条件
HibernateEntityManagerCondition其实是HibernateJpaAutoConfiguration自己定义的一个条件,
如果以下两个类之一存在于classpath,则该条件被满足:org.hibernate.ejb.HibernateEntityManagerorg.hibernate.jpa.HibernateEntityManager
在以上条件被满足的情况下,HibernateJpaAutoConfiguration作了如下事情 :
- 确保
spring.jpa为前缀的JPA配置属性被加载到JpaPropertiesbean;这些属性会在随后
HibernateJpaConfiguration工作时会被用到; - 导入
JPA + Hibernate配置类HibernateJpaConfiguration;
另外需要注意的是, 自动配置HibernateJpaAutoConfiguration会发生在DataSourceAutoConfiguration之后。这一点由注解@AutoConfigureAfter({ DataSourceAutoConfiguration.class })来定义。换句话讲,真正JPA + Hibernate这些上层组件的配置,一定要发生在下层组件DataSource的配置之后。
源代码
源代码版本 : spring-boot-autoconfigure-2.1.3.RELEASE
package org.springframework.boot.autoconfigure.orm.jpa;
// 省略 imports
@Configuration
@ConditionalOnClass({ LocalContainerEntityManagerFactoryBean.class, EntityManager.class })
@Conditional(HibernateEntityManagerCondition.class)
@EnableConfigurationProperties(JpaProperties.class)
@AutoConfigureAfter({ DataSourceAutoConfiguration.class })
@Import(HibernateJpaConfiguration.class)
public class HibernateJpaAutoConfiguration {
// 内嵌静态类,
// HibernateJpaAutoConfiguration 自定义的一个 SpringBootCondition 条件判断器,
// 给自己使用
// 如果以下两个类之一存在于 classpath , 则认为条件满足 , 否则认为条件不满足 :
// 1. org.hibernate.ejb.HibernateEntityManager
// 2. org.hibernate.jpa.HibernateEntityManager
@Order(Ordered.HIGHEST_PRECEDENCE + 20)
static class HibernateEntityManagerCondition extends SpringBootCondition {
private static final String[] CLASS_NAMES = {
"org.hibernate.ejb.HibernateEntityManager",
"org.hibernate.jpa.HibernateEntityManager" };
@Override
public ConditionOutcome getMatchOutcome(ConditionContext context,
AnnotatedTypeMetadata metadata) {
ConditionMessage.Builder message = ConditionMessage
.forCondition("HibernateEntityManager");
for (String className : CLASS_NAMES) {
if (ClassUtils.isPresent(className, context.getClassLoader())) {
return ConditionOutcome
.match(message.found("class").items(Style.QUOTE, className));
}
}
return ConditionOutcome.noMatch(message.didNotFind("class", "classes")
.items(Style.QUOTE, Arrays.asList(CLASS_NAMES)));
}
}
}

本文详细解析了SpringBoot中HibernateJpaAutoConfiguration的工作原理,包括其如何在特定条件下导入HibernateJpaConfiguration,以及自动配置发生在DataSourceAutoConfiguration之后的流程。深入探讨了条件HibernateEntityManagerCondition的满足条件,和确保JPA配置属性正确加载的机制。
1071

被折叠的 条评论
为什么被折叠?



