当前位置: 首页 > 知识库问答 >
问题:

AspectJ AOP和Spring在一起

夏才
2023-03-14

我想一起使用AEX J 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 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配置。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>

5:我在以下主要课程中运行所有内容:

package org.example.bugs.bug;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("org/example/bugs/bug/spring-config.xml");
        Info i = (Info) context.getBean("informer");
        i.info();
    }
}

...我得到一个错误:

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



我做错了什么

共有2个答案

孔安阳
2023-03-14

你错过了你的InfoAspect类...

您没有看到堆栈跟踪中org.example.bugs.bug.InfoAspectClassNotFind吗?也许它没有被Aspect J编译。

也许你需要另一个教程:

http://www.tutorialspoint.com/spring/aspectj_based_aop_appoach.htm

我会确保你有Spring 3并使用最新的习惯用法。

帅锦
2023-03-14

因为您试图使用Spring AOP支持的切入点,所以我建议您使用Spring AOP。将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>

重新获得

 类似资料:
  • 我有一个控制器,它的GET方法是这样写的: bean是正确的(getter和setter),服务调用返回带有thingId的正确ThingBean,并且显示了我在edit.jsp的JSP页面。 JSP是: 但是,JSP 显示主题和消息的空白值。是的,这些属性上有吸气剂/二传手。 我有一个非常相似的控制器,工作得很好,除了GET - mapped方法的签名中没有@RequestParam。 我在Sp

  • 我试着阅读有关Spring BOM、Spring Boot和Spring IO的文档。 但没有说明,我们应该如何一起使用还是不使用? 在我项目中,我们已经有了自己的父POM,所以我不能将它们用作父POM,但它们都有其他的方法可以使用,如下面定义依赖项管理 您需要Spring BOM、Spring Boot和Spring IO resolve版本 那么它们之间到底有什么区别呢?我更喜欢哪一个?在哪种

  • 正在处理一个庞大复杂的应用程序,该应用程序目前正在使用hibernate LocalSessionFactoryBean、HibernateTransactionManager和HibernateTemplate。有没有可能我可以使用JPA进行我的新特性开发,这样我就可以使用SPRING DATA JPA在我的持久性层上工作了?我的当前配置如下。 但是,我想为新的东西添加LocalContaine

  • 我正在Spring-Boot中实现微服务。我尝试将@RequestBody与一个MultipartFile一起发送。我在stackoverflow中引用了一些问题,但没有任何帮助。 视频类 方法 我只是试着用@requestpart,并附上我如何请求的屏幕截图 错误为

  • 这是请求 我试图在我的应用程序中使用上面的ejb 1) 包含JDBC语句2018-03-27 16:28:17,683:错误:http-nio-6180-exec-1:BatchingBatch.PerformExecution:HHH000315:Exception执行批处理[java.sql.BatchUpdateException:batch entry 0 insert into TEAM

  • 根据文档,spring batch admin非常容易嵌入到现有的应用程序中。简单地复制web.xml和index.jsp,然后添加所需的依赖项就足以使其工作。 但是如果我想在一个现有的spring boot项目中使用它,它会变得更糟。根据这个例子,这个配置有点蹩脚,但是它可以工作。直到我尝试在我的configuriton bean中使用注释。然后我得到以下异常。 我的配置很简单我有两个配置bea