在具有最终成员且没有默认构造函数的类上使用SpringAOP
我正在尝试使用spring aop。 我已经配置了以下方面:在具有最终成员且没有默认构造函数的类上使用SpringAOP,spring,aop,aspectj,spring-aop,cglib,Spring,Aop,Aspectj,Spring Aop,Cglib,我正在尝试使用spring aop。 我已经配置了以下方面: @Component @Aspect public class BenchmarkAspect { private static final Logger logger = LoggerFactory.getLogger(BenchmarkAspect.class); @Around(value = "@annotation(benchmark)") public void do(final Proceedi
@Component
@Aspect
public class BenchmarkAspect {
private static final Logger logger = LoggerFactory.getLogger(BenchmarkAspect.class);
@Around(value = "@annotation(benchmark)")
public void do(final ProceedingJoinPoint joinPoint, final Benchmark benchmark) throws Throwable {
logger.error("Before");
joinPoint.proceed();
logger.error("After");
}
这是一个使用我的服装注释的类的示例
@Component
public class AttributeContainer {
private static final Logger logger = LoggerFactory.getLogger(AttributeContainer.class);
private final int y;
public AttributeContainer(int y){
this.y = y;
}
@Benchmark
public void getAttribute() {
logger.error("Inside Attribute call...");
}
}
加载应用程序时,会出现以下异常:
nested exception is org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class com.test.AttributeContainer]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given:
java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given
at net.sf.cglib.proxy.Enhancer.emitConstructors(Enhancer.java:721)
at net.sf.cglib.proxy.Enhancer.generateClass(Enhancer.java:499)
at net.sf.cglib.transform.TransformingClassGenerator.generateClass(TransformingClassGenerator.java:33)
at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)
at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377)
at net.sf.cglib.proxy.Enhancer.create(Enhancer.java:285)
at org.springframework.aop.framework.Cglib2AopProxy.getProxy(Cglib2AopProxy.java:201)
at org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:112)
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.createProxy(AbstractAutoProxyCreator.java:476)
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:362)
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:322)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:407)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1461)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:848)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:790)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:707)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:478)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:284)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1106)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585)
更新
添加我的spring配置xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<aop:aspectj-autoproxy proxy-target-class="true"/>
<context:component-scan base-package="com.test.*" />
<bean id="test" class="com.test.AttributeContainer">
<constructor-arg value="34"/>
</bean>
</beans>
为什么CGlib无法创建子类??
谢谢
无法实例化bean类[…]:未找到默认构造函数
这看起来更像是一个Springbean配置/实例化问题,而不是与SpringAOP或AspectJ相关的任何问题
修复此问题后,您可能会遇到其他问题:
- 在您的建议中(value=“@annotation(benchmark)”)您应该注意拼写。我猜您希望注释
基准测试
以大写字母“B”开头,而不是小写字母
- 您的第二个建议参数
最终基准测试
来自哪里?它不通过
,args
或此
绑定。无论如何,您不会在建议中使用它,因此您可以删除它目标
更新以回答您的其他问题:
AopConfigException: Could not generate CGLIB subclass of class
[class com.test.AttributeContainer]: Common causes of this problem
include using a final class or a non-visible class;
nested exception is java.lang.IllegalArgumentException:
Superclass has no null constructors but no arguments were given
这个异常消息似乎是不言自明的。你读过了吗?实例化组件时不带参数,但只提供绝对需要参数的构造函数。这就是春天抱怨的原因。也许您想阅读Spring教程?请在adviceMethod的目标方法类中定义一个无参数公共或默认类型构造函数。希望它能解决您的问题。我熟悉AspectJ,但不熟悉Spring AOP。无论如何,如果您提供一个完整的、可编译的、最少的代码示例来重现您的问题,那么我可能会看到或建议一些东西。你的问题太不具体了。谢谢!我在问题中增加了更多细节@KriegaEx如果你提供一个无参数的参数,它能工作吗?我不能。。因为y是最终的@Dave Newton检查一下,你对init问题的看法是正确的。我解决了这个问题,得到了上面的异常(我更新了主要问题)。顺便说一句,@annotation(benchmark)可以工作,但无论如何我都会更改它。。!谢谢@kriegaex,你知道更新后的异常吗?那么你怎么解释当我从AttributeContainer中删除注释时,我没有异常,所以Spring方面我很好。我的问题是,出于某种原因,CGLIB不能将AttributeContainer子类化。我添加了spring配置xml,以向您显示AttributeContainer已正确初始化@kriegaexCGLIB创建一个动态代理。这就是Spring实现AOP的方式。CGLIB要求代理类以提供默认构造函数。所以请提供一个。或者切换到成熟的AspectJ而不是Spring AOP。它也可以在Spring内部工作。由于我的最终成员,我无法提供默认构造函数。但是我可以试着用AspectJ,我读到了,你能给我一个方向吗?你会有什么不同@kriegaex,谢谢你的评论!AspectJ语法是SpringAOP语法的超集。您可以使用SpringAOP和其他许多工具做相同的事情,并且不需要任何Java或CGLIB动态代理。在这里,您可以找到该工具以及文档。