Java Spring AOP代理不';I don’我没有按预期工作
实际上,我对spring代理的行为感到困惑。我想我知道j2ee、cglib和aspectj代理机制之间的主要区别。我在配置类中启用了aspectj自动代理,并且aspectj包含在类路径中 我的配置Java Spring AOP代理不';I don’我没有按预期工作,java,spring,dependency-injection,proxy,aspectj,Java,Spring,Dependency Injection,Proxy,Aspectj,实际上,我对spring代理的行为感到困惑。我想我知道j2ee、cglib和aspectj代理机制之间的主要区别。我在配置类中启用了aspectj自动代理,并且aspectj包含在类路径中 我的配置 @Configuration @EnableAspectJAutoProxy(proxyTargetClass = true) public class ApplicationConfiguration { ... } AspectJ依赖关系 <dependency>
@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class ApplicationConfiguration {
...
}
AspectJ依赖关系
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.5</version>
</dependency>
好:
到目前为止,我知道j2ee代理需要接口。但对我来说这是新的,cglib/aspectj代理不适用于实现接口的bean
有没有办法
。。。强制spring不使用j2ee代理
。。。强制spring使用cglib/aspectj代理(即使对于具有接口的类)
这是一个bug还是spring的期望行为
编辑:示例更新,@transnational
替换为@Validated
Edit2:解决方案:@Validated
受方法验证后处理器的影响。因此,对于这个bean,属性proxyTargetClass
必须设置为true
@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
final MethodValidationPostProcessor methodValidationPostProcessor;
methodValidationPostProcessor = new MethodValidationPostProcessor();
methodValidationPostProcessor.setProxyTargetClass(true);
return methodValidationPostProcessor;
}
注释适用于@Aspect
注释,而不是@Transactional
注释。为此,您需要在@Configuration
类上使用proxyTargetClass=true
属性值进行注释
@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = true)
@EnableTransactionManagement(proxyTargetClass = true)
public class ApplicationConfiguration {
...
}
你说得对。我还在第二个配置类上配置了@EnableTransactionManagement
,但没有proxyTargetClass=true
,出于某种原因,它可以工作。请注意,这只是一个示例,在服务类上使用@Validated
可以重现该问题。@baymon。因此,您必须将proxyTargetClass=true
设置为该注释,让spring为@Transactional
注释类使用CGLib代理。@baymon事实上,如果您没有使用spring AOP,您甚至不需要@enableSpectjautoproxy
注释。要在事务上启用aspectj代理,可以使用@EnableTransactionManagement
注释的模式
属性。我通过比较两个项目来分析所描述的行为。我当前的项目不使用数据库,但我想使用基于代理的bean验证。。。我已经修改了我的示例,不再关注@Transactional:)。。。我的问题是在我的服务类上使用@Validated时出现的。抱歉搞混了!
@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
final MethodValidationPostProcessor methodValidationPostProcessor;
methodValidationPostProcessor = new MethodValidationPostProcessor();
methodValidationPostProcessor.setProxyTargetClass(true);
return methodValidationPostProcessor;
}
@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = true)
@EnableTransactionManagement(proxyTargetClass = true)
public class ApplicationConfiguration {
...
}