概述
自动配置类PersistenceExceptionTranslationAutoConfiguration
的主要目的是启动Spring
框架提供的持久化层异常向Spring
标准异常的转换机制。
对该机制的启动PersistenceExceptionTranslationAutoConfiguration
是通过向容器注册一个PersistenceExceptionTranslationPostProcessor
来完成的。PersistenceExceptionTranslationAutoConfiguration
向容器注册该组件的条件是:
- 此组件
bean
尚未注册; - 配置选项
spring.dao.exceptiontranslation.enabled
未被明确设置为false
;
而PersistenceExceptionTranslationPostProcessor
是一个BeanPostProcessor
。它将每个Repository
组件bean
包装成一个代理对象并为该代理对象添加一个PersistenceExceptionTranslationAdvisor
。该PersistenceExceptionTranslationAdvisor
会拦截Repository
组件bean
的方法调用产生的异常并将其转换成Spring
框架标准异常。
源代码
源代码版本 : spring-boot-autoconfigure-2.1.3.RELEASE
package org.springframework.boot.autoconfigure.dao;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
@Configuration
// 仅在类 PersistenceExceptionTranslationPostProcessor 存在于 classpath 上才生效
// PersistenceExceptionTranslationPostProcessor 由包 spring-tx 提供
@ConditionalOnClass(PersistenceExceptionTranslationPostProcessor.class)
public class PersistenceExceptionTranslationAutoConfiguration {
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(prefix = "spring.dao.exceptiontranslation", name = "enabled",
matchIfMissing = true)
public static PersistenceExceptionTranslationPostProcessor
persistenceExceptionTranslationPostProcessor(Environment environment) {
PersistenceExceptionTranslationPostProcessor postProcessor =
new PersistenceExceptionTranslationPostProcessor();
boolean proxyTargetClass = environment.getProperty(
"spring.aop.proxy-target-class", Boolean.class, Boolean.TRUE);
postProcessor.setProxyTargetClass(proxyTargetClass);
return postProcessor;
}
}