3

私のSpringコンテキストファイルには、次のようなものがあります。

<bean id="userCheck" class="a.b.c.UserExistsCheck"/>
<aop:config>
      <aop:aspect ref="userCheck">
         <aop:pointcut id="checkUser"
                expression="execution(* a.b.c.d.*.*(..)) &amp;&amp; args(a.b.c.d.RequestObject)"/>
         <aop:around pointcut-ref="checkUser" method="checkUser"/>
      </aop:aspect>
</aop:config>    

abcUserExistsCheckは次のようになります。

@Aspect
public class UserExistsCheck {

@Autowired
private UserInformation userInformation;

public Object checkUser(ProceedingJoinPoint pjp) throws Throwable {
    int userId = ... //get it from the RequestObject passed as a parameter
    if (userExists(userId)) {
        return pjp.proceed();
    } else {
        return new ResponseObject("Invalid user);
    }
}

そして、このようなもので傍受されているクラスは次のようになります。

public class Klazz {
    public ResponseObject doSomething(RequestObject request) {...}
}

これは機能します。UserExistCheckは、呼び出しがKlazzに渡される前に必要に応じて実行されます。問題は、これが私がそれを機能させる唯一の方法であるということです。コンテキストファイルの代わりに注釈を使用してこれを機能させることは、私の小さな頭脳にとってはやりすぎのようです。では...UserExistsCheckとKlazzのメソッドにどの程度正確に注釈を付ける必要がありますか?そして、私はまだ何か他のものが必要ですか?別のクラス?コンテキストファイルにまだ何かありますか?

4

3 に答える 3

5

注釈ベースのAOPを有効にしましたか?ドキュメントには、追加する必要があると書かれています

<aop:aspectj-autoproxy/>

あなたの春の構成に。次に、メソッドの前にアノテーションを追加する必要がありますcheckUserここで@Around説明されているように、アドバイスが必要なようです。

@Aspect
public class UserExistsCheck {

  @Around("execution(* a.b.c.d.*.*(..)) && args(a.b.c.d.RequestObject)")
  public Object checkUser(ProceedingJoinPoint pjp) throws Throwable {
于 2010-04-10T03:02:45.530 に答える
3

提供したサンプルコードから、インターフェイスを実装していないクラスのアドバイスを作成しようとしているようです。Springドキュメントの「プロキシメカニズム」セクションで説明されているように、これを行う場合は、CGLIBを有効にする必要があります。

<aop:aspectj-autoproxy proxy-target-class="true" />

個人的には、これはドキュメントに示されているよりも少し厄介であることがわかりました。すべての星が正しく配置されていれば機能しますが、多くの場合、宣言する方が簡単であり、設計の観点からも望ましいです。次のように、インターフェイスに関するAOPアドバイス。( /KlazzImplからのインスタンスを取得する必要があることに注意してください。)BeanFactoryApplicationContext

public interface Klazz {
  ResponseObject doSomething(RequestObject request);
}

public class KlazzImpl implements Klazz {
  public ResponseObject doSomething(RequestObject request) {...}
}

さらに、args式の使用は少しずれています。以下を参照してください。

@Aspect
public class UserExistsCheck {
  @Autowired
  private UserInformation userInformation;

  @Around("execution(* a.b.c.d.*.*(..)) && args(reqObj)")
  public Object checkUser(ProceedingJoinPoint pjp, a.b.c.d.RequestObject reqObj) throws Throwable {
      // ...
  }
}

これらの変更でうまくいくはずです。

于 2010-04-10T04:38:14.830 に答える
1

春3.1以来@EnableAspectJAutoProxy(proxyTargetClass=true)あなたに追加@Configuraiton

于 2012-08-28T11:05:33.127 に答える