默认使用jdk代理
public @interface EnableAspectJAutoProxy { boolean proxyTargetClass() default false; boolean exposeProxy() default false; }
根据
proxyTargetClass
false代表为jdk代理,
true代表为cglib代理
@SuppressWarnings("serial") public class DefaultAopProxyFactory implements AopProxyFactory, Serializable { @Override public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException { if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) { Class<?> targetClass = config.getTargetClass(); if (targetClass == null) { throw new AopConfigException("TargetSource cannot determine target class: " + "Either an interface or a target is required for proxy creation."); } if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) { return new JdkDynamicAopProxy(config); } return new ObjenesisCglibAopProxy(config); } else { return new JdkDynamicAopProxy(config); } }
发现的的新东西(一种补偿机制)
当代理出现异常时,如果开启 (默认开启)
spring.dao.exceptiontranslation.enabled=true
则会改变proxyTargetClass为true,使用cglib在次代理
*/ @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; } }
遇到的问题
当使用,一个接口被一个抽象类实现后抽象类被普通类继承
根据代理的类型分为两种
jdk 代理:实现同一个接口进行代理
cglib代理:继承同一个类进行代理
1.上述情况不能够被代理成功,也就不能被Spring IOC进行管理,也就不可能会被注入项目中,
2.根据实际情况发现该类会被代理成功,观察发现其用的是cglib代理,由此印证上述的一种类似的补偿机制
遗留问题
配置文件关闭它 spring.dao.exceptiontranslation.enabled=false
项目依然启动成功