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)));
		}

	}

}

参考文章

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值