Intellij idea AspectJ AOP和Spring在一起
我想同时使用AspectJ AOP和Spring(用于DI),但我得到以下例外:Intellij idea AspectJ AOP和Spring在一起,intellij-idea,aspectj,spring-aop,Intellij Idea,Aspectj,Spring Aop,我想同时使用AspectJ AOP和Spring(用于DI),但我得到以下例外: org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class 我使用IntelliJ IDEA 12 Ultimate IDE。 下面是重现错误的示例步骤 1:信息界面: package org.example.bugs.bug; public interface Info { public void
org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class
我使用IntelliJ IDEA 12 Ultimate IDE。下面是重现错误的示例步骤 1:信息界面:
package org.example.bugs.bug;
public interface Info {
public void info();
}
2:接口实现:
package org.example.bugs.bug;
public class Informer implements Info {
@Override
public void info() {
System.out.println("Some info from Informer!");
}
}
3:方面:
package org.example.bugs.bug;
public aspect InfoAspect {
public InfoAspect() {}
pointcut info() : execution(* org.example.bugs.bug.Informer.info(..));
after() returning() : info() {
System.out.println("Information confirmed by InfoAspect!");
}
}
4:spring-config.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<aop:aspectj-autoproxy />
<bean id="informer"
class="org.example.bugs.bug.Informer"/>
<bean class="org.example.bugs.bug.InfoAspect"
factory-method="aspectOf"/>
</beans>
…我得到一个错误:
2013-03-24 15:46:10 org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@f81843: startup date [Sun Mar 24 15:46:10 CET 2013]; root of context hierarchy
2013-03-24 15:46:10 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [org/example/bugs/bug/spring-config.xml]
2013-03-24 15:46:10 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@13ad085: defining beans [org.springframework.aop.config.internalAutoProxyCreator,informer,org.example.bugs.bug.InfoAspect#0]; root of factory hierarchy
2013-03-24 15:46:10 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry destroySingletons
INFO: Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@13ad085: defining beans [org.springframework.aop.config.internalAutoProxyCreator,informer,org.example.bugs.bug.InfoAspect#0]; root of factory hierarchy
Exception in thread "main" org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [org.example.bugs.bug.InfoAspect] for bean with name 'org.example.bugs.bug.InfoAspect#0' defined in class path resource [org/example/bugs/bug/spring-config.xml]; nested exception is java.lang.ClassNotFoundException: org.example.bugs.bug.InfoAspect
at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1266)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getTypeForFactoryMethod(AbstractAutowireCapableBeanFactory.java:629)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:578)
at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1335)
at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:901)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:607)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
at org.example.bugs.bug.Main.main(Main.java:8)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: java.lang.ClassNotFoundException: org.example.bugs.bug.InfoAspect
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at org.springframework.util.ClassUtils.forName(ClassUtils.java:260)
at org.springframework.beans.factory.support.AbstractBeanDefinition.resolveBeanClass(AbstractBeanDefinition.java:416)
at org.springframework.beans.factory.support.AbstractBeanFactory.doResolveBeanClass(AbstractBeanFactory.java:1287)
at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1258)
... 15 more
2013-03-24 15:46:10 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息:刷新org.springframework.context.support。ClassPathXmlApplicationContext@f81843:启动日期[2013年3月24日星期日15:46:10 CET];上下文层次结构的根
2013-03-24 15:46:10 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息:从类路径资源[org/example/bugs/bug/spring config.XML]加载XMLBean定义
2013-03-24 15:46:10 org.springframework.beans.factory.support.DefaultListableBeanFactory预实例化单例
信息:在org.springframework.beans.factory.support中预实例化单例。DefaultListableBeanFactory@13ad085:定义bean[org.springframework.aop.config.internalAutoProxyCreator,informer,org.example.bugs.bug.InfoAspect#0];工厂层次结构的根
2013-03-24 15:46:10 org.springframework.beans.factory.support.DefaultSingletonBean注册表销毁Singleton
信息:在org.springframework.beans.factory.support中销毁单例。DefaultListableBeanFactory@13ad085:定义bean[org.springframework.aop.config.internalAutoProxyCreator,informer,org.example.bugs.bug.InfoAspect#0];工厂层次结构的根
线程“main”org.springframework.beans.factory.CannotLoadBeanClasseException中的异常:找不到在类路径资源[org/example/bugs/bug/spring config.xml]中定义的名为“org.example.bugs.bug.InfoAspect”的bean的类[org.example.bugs.bug.InfoAspect];嵌套异常是java.lang.ClassNotFoundException:org.example.bug.bug.InfoAspect
位于org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1266)
位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getTypeForFactoryMethod(AbstractAutowireCapableBeanFactory.java:629)
位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:578)
位于org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1335)
位于org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:901)
位于org.springframework.beans.factory.support.DefaultListableBeanFactory.PreInstanceSingleton(DefaultListableBeanFactory.java:607)
位于org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)
位于org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
位于org.springframework.context.support.ClassPathXmlApplicationContext。(ClassPathXmlApplicationContext.java:139)
位于org.springframework.context.support.ClassPathXmlApplicationContext。(ClassPathXmlApplicationContext.java:83)
位于org.example.bugs.bug.Main.Main(Main.java:8)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)中
位于java.lang.reflect.Method.invoke(Method.java:597)
位于com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
原因:java.lang.ClassNotFoundException:org.example.bugs.bug.InfoAspect
位于java.net.URLClassLoader$1.run(URLClassLoader.java:202)
位于java.security.AccessController.doPrivileged(本机方法)
位于java.net.URLClassLoader.findClass(URLClassLoader.java:190)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:306)
位于sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:247)
位于org.springframework.util.ClassUtils.forName(ClassUtils.java:260)
位于org.springframework.beans.factory.support.AbstractBeanDefinition.resolveBeanClass(AbstractBeanDefinition.java:416)
位于org.springframework.beans.factory.support.AbstractBeanFactory.doResolveBeanClass(AbstractBeanFactory.java:1287)
位于org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1258)
... 还有15个
我做错了什么?
您错过了InfoAspect课程 您没有在堆栈跟踪中看到
org.example.bugs.bug.InfoAspect
的ClassNotFound
?也许它不是由Aspect J编译的
也许您需要另一个教程:
我会确保您使用了Spring3并使用了最新的习惯用法。因为您正在尝试使用SpringAOP支持的切入点,我建议您使用SpringAOP。将spring与完整的特性集AspectJ一起使用有点复杂,因为它需要通知。此外,
用于@AspectJ风格的springaop,但仍然是代理目标的spring,而不是AspectJ
因此,我将按照以下方式转换示例方面:
@Aspect
public class InfoAspect {
public InfoAspect() {
}
@Pointcut("execution(* prospring3.aop.aspectj.Informer.info(..))")
void infoPointcut() {
}
@AfterReturning("infoPointcut()")
public void afterReturning(JoinPoint joinPoint) {
System.out.println("Information confirmed by InfoAspect!");
System.out.println("joinPoint.getSignature().getName() = " + joinPoint.getSignature().getName());
}
}
@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = true) // use the CGLib instead of Java Proxy
public class AspectJConfig {
@Bean
public Info info() {
return new Informer();
}
/**
* Aspect must be a config as a bean
* @return the aspect
*/
@Bean
public InfoAspect infoAspect() {
return new InfoAspect();
}
}
public class InformerTest {
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(AspectJConfig.class);
final Info bean = ctx.getBean(Info.class);
bean.info();
}
}
注意:在pom.xml中包含以下依赖项
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.12</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.12</version>
</dependency>
奥帕林
奥帕林
1
org.aspectj
aspectjrt
1.6.12
org.aspectj
aspectjweaver
1.6.12
Regads我在类路径中有所有必需的JAR,因为SpringAOP工作正常。我认为问题在于[factory method=“aspectOf”]。我不知道为什么编译的InfoAspect不存在?你没有的是你试图创建的aspect。您了解了Aspect-J的工作原理——它在运行时创建字节码。听起来你错过了这一步,因为类加载器找不到你的InfoAspect。Th
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.12</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.12</version>
</dependency>