0

ポイントカット式を使用したメソッドのアドバイスに本当に問題があります。私は次の構成を持っています:

春 3.1.2.RELEASE

pom.xml

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aop</artifactId>
      <version>${org.springframework.version}</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>1.7.2</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.7.2</version>
    </dependency>

サーブレット.xml

    <aop:aspectj-autoproxy/>

アドバイスしたいクラス

@Repository(value="userDaoImpl")
@Transactional
public class UserDaoImpl implements UserDao{

    //attributes and methods

    @Override
    public void delete(ProfiledUser user) throws HibernateException
    {
        sessionFactory.getCurrentSession().delete(user);        
    }
}

UserDaoインターフェイスを拡張するインターフェイスを実装しますGenericDao<T>

これが私のアドバイスです

@Aspect
@Component("userDeletionAspect")
public class UserDeletionAspect {

    @Pointcut("execution(public void aa.bb.cc.dd.UserDaoImpl.delete(..))")
    public void objectDeletionPointcut(){}

    @Before("objectDeletionPointcut()")
    public void notifyDeletion(JoinPoint jp)
    {       
        System.out.println("pointcut executed");
    }
}

これは機能しません。これは、UserDaoImpl の delete メソッドが実行されたときに、まったく傍受されないことを意味します。

Spring Documentation から、Spring プロキシがインターフェイスで動作することを読んだので、Pointcut 定義を次のように変更しようとしました。

  @Pointcut("execution(* aa.bb.cc.dd.GenericDao.delete(..))")

しかし、何も変わりません。クラスの.delete()メソッドをインターセプトするにはどうすればよいですか?UserDaoImpl

4

1 に答える 1

1

あなたが必要

<aop:aspectj-autoproxy>
    <aop:include name="userDeletionAspect"/>
</aop:aspectj-autoproxy>

それ以外の

<aop:aspectj-autoproxy/>

参考までに - ポイントカット式で具体的なクラスまたは特定のインターフェイスの実装をターゲットにすることができます。

Spring はパブリック メソッドのみをターゲットにできるため、ポイントカット式から「パブリック」部分を削除できます。また、必要に応じて、次のようにポイントカット式とともにアドバイスを宣言できます。

@Before("execution(void aa.bb.cc.dd.UserDaoImpl.delete(..))")
public void notifyDeletion(JoinPoint jp) {       
     System.out.println("pointcut executed");
}

これで問題は解決しましたが、まだ問題がある場合は、Spring AOP を使用した簡単なロギングの例を次に示します - logging with AOP in spring?

于 2013-05-11T18:07:36.427 に答える