4

我是 SpringAOP 的新手。我想写一个简单的介绍示例,但无法清楚地理解它必须如何工作。

在文档中我发现:

简介:代表一个类型声明额外的方法或字段。Spring AOP 允许您向任何建议的对象引入新接口(和相应的实现)。例如,您可以使用介绍使 bean 实现 IsModified 接口,以简化缓存。(介绍在 AspectJ 社区中称为类型间声明。)

我写了一个简单的例子:我用一种方法写了一个简单的类

public class Test {
    public void test1(){
        System.out.println("Test1");
    }
}

然后我写实现这个接口的接口和类

public interface ITest2 {
    void test2();
}

public class Test2Impl implements ITest2{
    @Override
    public void test2() {
        System.out.println("Test2");
    }
}

最后是我的方面

@Aspect
public class AspectClass {

    @DeclareParents(
            value = "by.bulgak.test.Test+",
            defaultImpl = Test2Impl.class
    )
    public static ITest2 test2;
}

我的弹簧配置文件如下所示:

<aop:aspectj-autoproxy/>
<bean id="aspect" class="by.bulgak.aspect.AspectClass" />

所以我的问题是:我现在怎么能这样。我需要在我的主课上写什么到海结果?可能是我需要写一些其他的类。(我读到的关于 SpringAOP 的书我找不到完整的例子)

更新

我的主要方法如下所示:

public static void main(String[] args) {
    ApplicationContext appContext = new ClassPathXmlApplicationContext("spring-configuration.xml");
    Test test = (Test) appContext.getBean("test");
    test.test1();
    ITest2 test2 = (ITest2) appContext.getBean("test");
    test2.test2();

}

当我执行我的应用程序时,我收到此错误:

Exception in thread "main" java.lang.ClassCastException: com.sun.proxy.$Proxy5 cannot be cast to by.bulgak.test.Test

在这一行:

Test test = (Test) appContext.getBean("test");
4

1 回答 1

3

首先,您需要Test在配置文件中定义 bean:

<bean id="test" class="Test" />

然后主要从以下位置获取此bean ApplicationContext

Test test1 = (Test) context.getBean("test");

现在,从test1引用中,您只能调用Testbean 中定义的方法。要使用新引入的行为,您需要对包含该行为的接口的引用进行类型转换:

ITest2 test2 = (ITest2) context.getBean("test");

然后,您可以Test2从此参考访问方法:

test2.test2();

这将调用在注解defaultImpl属性中指定的 bean 中定义的方法。@DeclareParents

于 2013-06-18T18:36:29.413 回答