[MJ46 - Aspectos] Alguém aí usa aspectos?

A linguagem F# é orientada a aspectos

pretendo aprender essa linguagem em breve

Escrevi um novo artigo na edição 48 da MundoJ sobre aspectos, dessa vez focando em static crosscutting.

Quem se interessou pelo outro artigo, acho que vale a pena dar uma olhada!

Guerra, parabéns pelos artigos os 2 estão muito bons, eles me incentivaram a estudar mais sobre AOP.
Estou tentando fazer um Aspect pra gerenciar a transação do Hibernate e tirar aquele famoso BEGIN/COMMIT/ROLLBACK de dentro filtro da WEB.

Pra isso criei um Aspect igual a esse, eu mantenho a abertura da Session do HibernateUtil no Filtro WEB mas os métodos que usam transação eu passei a anotar os métodos com @Transacao:


public aspect TransactionAspect {
	pointcut transaction(): call(@Transacao * *.*(..));
	
	before(): transaction() {
		System.out.println("INICIAR TANSACAO PELO HIBERNATEUTIL");
	}
	after() returning() : transaction() {
		System.out.println("COMMIT PELO HIBERNATEUTIL");
	}
	after() throwing() : transaction() {
		System.out.println("ROWBACK PELO HIBERNATEUTIL");
		
	}
}

Ficou legal mas surgiu uma dúvida, tem como resolver o problema de um método anotado com @Transacao ser chamado por outro também anotado por @Transacao, exemplo:

       @Transacao
	public void debita(Conta c, BigDecimal valor) {
		//Debita e da update na conta
	}
	@Transacao
	public void credita(Conta c, BigDecimal valor) {
		//Credita e da update na conta
	}
	@Transacao
	public void transfere(Conta c, BigDecimal valor) {
		debita(c, valor);
		credita(c, valor);
	}

nesse caso se eu chamar o método "transfere"não vai dar certo pois os dois outros métodos estão anotados com Transacao,
Alguem sabe se existe um jeito de fazer isso funcionar ali no meu aspect.

Ou seja quando o método transfere for chamado ele “desabilita” o aspect na chamada do debita e do credita?

Valeu pela ajuda, e de novo parabéns pelos artigos