12

I want to create a Pointcut for private methods that are annotated with a specific annotation. However my aspect is not triggered when the annotation is on a private method like below.

@Aspect
public class ServiceValidatorAspect {
    @Pointcut("within(@com.example.ValidatorMethod *)")
    public void methodsAnnotatedWithValidated() {
}

@AfterReturning(
            pointcut = "methodsAnnotatedWithValidated()",
            returning = "result")
    public void throwExceptionIfErrorExists(JoinPoint joinPoint, Object result) {
         ...
}

Service Interface

public interface UserService {

    UserDto createUser(UserDto userDto);
}

Service Implementation

    public class UserServiceImpl implements UserService {

       public UserDto createUser(UserDto userDto) {

             validateUser(userDto);

             userDao.create(userDto);
       }

       @ValidatorMethod
       private validateUser(UserDto userDto) {

            // code here
       }

However if I move the annotation to a public interface method implementation createUser, my aspect is triggered. How should I define my pointcut or configure my aspect to get my original use case working?

4

2 に答える 2

30

8. Spring を使用したアスペクト指向プログラミング

Spring の AOP フレームワークのプロキシベースの性質により、保護されたメソッドは定義上、JDK プロキシ (これが適用されない場合) にも CGLIB プロキシ (これは技術的に可能ですが、AOP の目的には推奨されない場合) でもインターセプトされません。結果として、特定のポイントカットはパブリック メソッドに対してのみ照合されます。

傍受のニーズに保護された/プライベート メソッドまたはコンストラクターが含まれる場合は、Spring のプロキシ ベースの AOP フレームワークの代わりに、Spring 駆動のネイティブ AspectJ ウィービングの使用を検討してください。これは、異なる特性を持つ異なる AOP 使用モードを構成するため、決定を下す前に、まずウィービングに慣れてください。

于 2013-02-26T16:24:56.860 に答える
1

AspectJ に切り替えて、特権アスペクトを使用します。または、Spring AOP の制限に対応するようにアプリケーションの設計を変更します。私の選択は、はるかに強力な AspectJ です。

于 2013-02-26T20:36:22.093 に答える