1
我想在我的DAO的父類配置的交易,並禁止一個具體的DAO都有自己的事務的配置,所以我用溫泉@Transactional
:AspectJ的匹配註解的類,但不是它的子類
@Transactional(/* some transactionConfig */)
abstract class AbstractDao
{
//...
}
// this is ok
class UserDao extends AbstractDao
{
//...
}
@Transactional (/* some other config*/) // this should be illegal
class DocumentDao extends AbstractDao
{
//...
}
我用AspectJs @DeclareError
執行我的設計規則。當我使用followint錯誤和切入點聲明時,我也會在(法定)UserDao中的代碼中獲取錯誤,因爲它繼承了AbstractDao中的Annotation。
@Pointcut("call(*.new(..)) || call(* *(..)) || set (* *) || get (* *)")
public void doAnything()
{
// no code
}
@Pointcut("within(@org.springframework.transaction.annotation.Transactional *) && doAnything()")
public void transactionalClass()
{
// only pointcut, no code
}
@Pointcut("within(AbstractDao+) && !within(AbstractDao)")
public void inDao()
{
// no code
}
@DeclareError("transactionalMethod() && doAnything() && inDao()")
public static final String TRANSACTIONAL_NOT_ALLOWED =
"@Transactional of this method is not necesarry, we have it on class level in AbstractDao";
@DeclareError("transactionalClass() && inDao() && doAnything()")
public static final String ERROR = "Transactional is not allowed on method level";
是否有可能只匹配那些explicitelty註釋(在這個例子中DocumentDao
)班?
這是我的第一個想法bit transactionaClass匹配所有的DAO類,因爲它們從具有@Transactional註解的AbstractDao繼承而來,不僅僅是那些具有明確註釋的類。 –
我不跟着你。儘管transactionaClass與所有DAO對象相匹配,但最終的切入點是受限的,因此只考慮DAO的子類。但無論如何,我更喜歡下面的第二個答案。 –