0

アプリケーションコンテキストから取得した ShapeService があります。shapeService には Circle と Triangle が注入されます。shapeService に getCircle() と getTriangle() があります。また、ゲッターが呼び出されるたびにトリガーされるように構成されたアドバイスもあります。すべてのゲッターに適用できるように指定されたポイントカット式。したがって、 getCircle() または getTriangle() が呼び出されるたびに、アドバイスがトリガーされます。しかし、なぜそれが applicationContext.getBean() に対してトリガーされないのか疑問に思っていました。それもポイントカット式を満たすゲッターです。トリガーされない理由を理解するのを手伝ってくれる人はいますか。

@Aspect
@Component
    public class LoggingAspect {

    @Before("allGetters()")
    public void loggingAdvice(JoinPoint joinPoint){
        System.out.println(joinPoint.getTarget());
    }

    @Pointcut("execution(public * get*(..))")
    public void allGetters(){}
}

これは、Bean を取得するメイン クラスです。Shapeservice の getter と circle の getter のみがトリガーされ、apllicationContext の getBean はトリガーされません

public class AopMain {
        public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("spring-config.xml");
        ShapeService shapeService = ctx.getBean("shapeService", ShapeService.class);
        System.out.println(shapeService.getCircle().getName());

    }
}

ありがとう

4

2 に答える 2

1

アプリケーションコンテキストはSpringコンポーネント(他のコンポーネントを管理するコンテナー)ではないため、Spring AOPを使用している場合は、それ自体は織り込まれません。AspectJを使用した場合、すべてのゲッターをインターセプトできますが、それでも、ロード時のウィービングを使用するか、クラスパス上のすべてのjarを再コンパイルする場合に限ります。

于 2012-11-27T06:44:35.173 に答える
0

@Daveが暗示しているように、アスペクトを有効にするには、コンパイル時(CTW)またはクラスロード時(LTW)にそれらを「織り込む」必要があります。

AspectJ+Spring の魔法の恩恵を受けるには、非常に柔軟な LTW などの使用を検討してください (サードパーティの jar から、アスペクトを変更せずにクラスに織り込むこともできます)。

Spring Documentationを読むことから始めてください。これは良いエントリーポイントです。基本的:

  • <context:load-time-weaver/>Spring構成に要素を入れます
  • クラスパスにファイルを作成しMETA-INF/aop.xmlます。

    <!DOCTYPE aspectj PUBLIC "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd">
    <aspectj>
      <weaver>
        <!-- include your application-specific packages/classes -->
        <!-- Nota: you HAVE TO include your aspect class(es) too! -->
        <include within="foo.ShapeService"/>
        <include within="foo.LoggingAspect"/>
      </weaver>
      <aspects>
        <!-- weave in your aspect(s) -->        
        <aspect name="foo.LoggingAspect"/>
      </aspects>
    </aspectj>
    
  • weaving Java エージェントで実行します。java -javaagent:/path/to/lib/spring-instrument.jar foo.Main
于 2012-11-27T11:22:55.893 に答える