除了 @Configurable aspect,spring-aspects.jar 还包含一个 AspectJ aspect,你可以用它来驱动 Spring 的事务管理,用于注解有 @Transactional 注解的类型和方法。这主要是为那些想在 Spring 容器之外使用 Spring 框架的事务支持的用户准备的。
解释 @Transactional 注解的 aspect 是 AnnotationTransactionAspect。当你使用这个 aspect 时,你必须注解实现类(或该类中的方法或两者),而不是该类实现的接口(如果有的话)。AspectJ 遵循 Java 的规则,即接口上的注解不被继承。
一个类上的 @Transactional 注解指定了执行该类中任何公共操作的默认事务语义。
在类中的方法上的 @Transactional 注解覆盖了由类注解给出的默认事务语义(如果存在的话)。任何可见性的方法都可以被注解,包括 private 方法。直接注解非 public 方法是获得执行此类方法的事务划分的唯一方法。
:::tips 从 Spring Framework 4.2 开始,spring-aspects 提供了一个类似的 aspect,为标准的 javax.transaction.Transactional 注解提供了完全相同的功能。查看 JtaAnnotationTransactionAspect 了解更多细节。 :::
对于想使用 Spring 配置和事务管理支持但不想(或不能)使用注解的 AspectJ 程序员来说,spring-aspects.jar 也包含了抽象的 aspect,你可以通过扩展来提供你自己的 pointcut 定义。更多信息请参见 AbstractBeanConfigurerAspec 和 AbstractTransactionAspect 的源代码。作为一个例子,下面的摘录显示了你如何编写一个 aspect,通过使用与完全合格的类名相匹配的 prototype Bean 定义来配置领域模型中定义的对象的所有实例:
public aspect DomainObjectConfiguration extends AbstractBeanConfigurerAspect {
public DomainObjectConfiguration() {
setBeanWiringInfoResolver(new ClassNameBeanWiringInfoResolver());
}
// the creation of a new bean (any object in the domain model)
protected pointcut beanCreation(Object beanInstance) :
initialization(new(..)) &&
CommonPointcuts.inDomainModel() &&
this(beanInstance);
}