Spring Boot 自动配置 : HibernateJpaAutoConfiguration

概述

HibernateJpaAutoConfigurationSpring Boot针对使用JPA + Hibernate的自动配置类,它的主要目的是在特定条件被满足的情况下导入配置类HibernateJpaConfiguration。关于运行时使用的JPA + Hibernate组件的真正的配置工作,被委托给了HibernateJpaConfiguration来完成。

HibernateJpaAutoConfiguration导入HibernateJpaConfiguration的特定条件是 :

  1. LocalContainerEntityManagerFactoryBeanEntityManager必须存在于classpath;
  2. 条件HibernateEntityManagerCondition必须被满足;

    条件HibernateEntityManagerCondition其实是HibernateJpaAutoConfiguration自己定义的一个条件,
    如果以下两个类之一存在于classpath,则该条件被满足:

    1. org.hibernate.ejb.HibernateEntityManager
    2. org.hibernate.jpa.HibernateEntityManager

在以上条件被满足的情况下,HibernateJpaAutoConfiguration作了如下事情 :

  1. 确保spring.jpa为前缀的JPA配置属性被加载到JpaProperties bean;

    这些属性会在随后HibernateJpaConfiguration工作时会被用到;

  2. 导入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)));
		}

	}

}

参考文章

  • Spring Boot 配置 : HibernateJpaConfiguration
  • Spring Boot 配置 : JpaBaseConfiguration

你可能感兴趣的:(Spring,JPA,Spring,Boot,Spring,Boot,自动配置)