0

私はSpringsが初めてで、Javaアドバイスを使用して単純なJavaアプリケーションを実行しようとしています....

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"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/aop
           http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd"> 
    <aop:aspectj-autoproxy>
        <aop:include name="com.cts.two.Advices"/>
    </aop:aspectj-autoproxy>    
    <context:annotation-config/>
    <context:component-scan base-package="com.cts.two"></context:component-scan>
</beans>

アドバイスクラス

package com.cts.two;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class Advices implements Adv{    

    @Pointcut("execution(* com.cts.two.*.*(..))")
    public void advice(){

    }
    @Before("advice()")
    public void before(JoinPoint name) throws Throwable{
        System.out.println("inside advices");
        /*System.out.println(name.getClass() + " this is get class");
        System.out.println(name.getSignature().getName() + " this is the get signatue and get name");*/
    }
}

アドバイスを適用する必要があるクラス... Advice クラスの before メソッドを後述の test() メソッドの前に実行したい

package com.cts.two;

import org.springframework.stereotype.Component;
@Component

public class ClassA {
    private ClassB b= new ClassB();

    public void setB(ClassB b) {
        this.b = b;
    }
    public void test(){
        System.out.println("inside classA test");
        //b.test();
    }

}

メソッド/テスト クラス/メイン クラスの呼び出し元

package com.cts.two;

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

public class CallerAB {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ApplicationContext context = new ClassPathXmlApplicationContext(
                "AllAnnotations.xml");
        ClassA calledA = (ClassA) context.getBean("classA");
        calledA.test();
    }

}

問題は、コードを直接実行すると、クラス A のテスト メソッドが実行されますが、アドバイスが実行されないことです...親切なアドバイス..何か不足していますか??? AspectJ 1.6.12 jar も追加されています...

4

2 に答える 2

2

アスペクトは Bean としてデカールする必要があります。

@Aspect自動的に<aop:include>は行われず、同様にも行われません (アスペクトとして使用できる Bean に追加の制限を設定します)。

だから、あなたが必要です

@Aspect
@Component
public class Advices implements Adv { ... }

必要はありません<aop:include>

于 2012-05-02T11:01:51.453 に答える
0

@axtavt からの回答で述べたように、@Component注釈を追加する必要があります。ただし、 も削除する必要があります<aop:include>。春の配線xmlは次のようになります。

<aop:aspectj-autoproxy/>
<context:annotation-config/>
<context:component-scan base-package="com.cts.two"/>

Spring AOP documentationに記載されているように、要素のname属性は<aop:include>、クラス名ではなく、Bean 名であると想定されています。Bean を明示的に指定すると、Spring の自動検出がオーバーライドされ、誤って指定すると、アスペクトがまったく使用されないことを意味します。

于 2012-07-04T23:11:05.683 に答える