Spring AOP usually works via a proxy around your bean. If a method inside the same class calls another advised method directly (`this.someMethod()`), it bypasses the proxy, so aspects like `@Transactional` may not apply.
Spring AOP is usually **proxy-based**:
The proxy intercepts calls **made through the proxy**. When code inside the bean calls another method on `this`, it never leaves the target object, so the proxy can’t intercept it.
@Service
class BillingService {
@Transactional
public void pay() { /* ... */ }
public void run() {
this.pay(); // bypasses proxy -> no transaction
}
}