首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用@AspectJ风格学习SpringAOP时看到奇怪的行为

使用@AspectJ风格学习SpringAOP时看到奇怪的行为
EN

Stack Overflow用户
提问于 2013-12-16 18:13:15
回答 1查看 132关注 0票数 0

Iam是Spring框架的一个新概念,我指的是spring项目提供的文档。

在这个过程中,我还学习了一个新的概念AOP。我正在按照春季文档来试用一些示例http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html

我尝试使用Spring在我的第一个方面Helloworld中使用"@AspectJ“样式。

这是我的上下文配置文件

代码语言:javascript
复制
<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" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/aop 
    http://www.springframework.org/schema/aop/spring-aop.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context.xsd">

     <aop:aspectj-autoproxy expose-proxy="false" />

    <context:annotation-config></context:annotation-config>

    <bean id="aoProgrammingAspectJ" class = "com.AOProgramming.AOProgrammingAspectJ">
    </bean>


    <bean id="aoProgrammingImpl" class = "com.AOProgramming.AOProgrammingImpl">
    </bean>

</beans>

这是一个简单的界面

代码语言:javascript
复制
package com.AOProgramming;

public interface AOProgrammingInterface {

    public void startAspecting();

}

我实现了这个接口

代码语言:javascript
复制
package com.AOProgramming;

public class AOProgrammingImpl implements AOProgrammingInterface {


    @Override
    public void startAspecting() {

        System.out.println("THe Aspecting has just begun for :");

    }
}

这就是我定义切入点和建议的方面定义的地方。

代码语言:javascript
复制
package com.AOProgramming;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;


@Aspect
public class AOProgrammingAspectJ {

    @Pointcut("execution( * com.AOProgramming.*.*(..))")
    public void cuttingOne() {}

    @Before("cuttingOne()")
    public void adviceCuttingOne1(){

        System.out.println("This is the at the beginning");

    }



}

这是我真正的扑克课

代码语言:javascript
复制
package com.AOProgramming;

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

public class AOProgrammingInvokerApp {

    public static void main(String[] args){

        ApplicationContext context = new ClassPathXmlApplicationContext("AOProgramming-servlet.xml");

        AOProgrammingImpl obj = (AOProgrammingImpl) context.getBean("aoProgrammingImpl");

        obj.startAspecting();

    }

}

当我试图执行该示例时,我将得到以下错误

代码语言:javascript
复制
Exception in thread "main" java.lang.ClassCastException: com.sun.proxy.$Proxy6 cannot be cast to com.AOProgramming.AOProgrammingImpl
    at com.AOProgramming.AOProgrammingInvokerApp.main(AOProgrammingInvokerApp.java:12)

我试图重新阅读完整的网页,但我仍然有同样的问题,也没有得到足够的材料处理最新的Spring样本。所有的日期都在2002年或2008年,这有不同的解释SpringAOP的方式。

有人能帮我理解我错过了什么吗?

感谢你的帮助

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-16 18:46:51

要理解这一点,您需要了解JDK代理起作用,它们的局限性是什么(另一种选择,CGLIB代理)是如何实现的。简而言之,JDK代理只保留目标bean接口的类型。因此,为AOProgrammingImpl生成的代理将是AOProgrammingInterface类型,而不是AOProgrammingImpl类型,即使目标是AOProgrammingImpl类型的。

你可以改变这个

代码语言:javascript
复制
AOProgrammingImpl obj = (AOProgrammingImpl) context.getBean("aoProgrammingImpl");

到这个

代码语言:javascript
复制
AOProgrammingInterface obj = (AOProgrammingInterface) context.getBean("aoProgrammingImpl");

也可以将CGLIB添加到类路径中,并将配置更改为

代码语言:javascript
复制
<aop:aspectj-autoproxy expose-proxy="false" proxy-target-class="true" />

因此Spring使用了使用类类型的CGLIB代理。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20617865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档