To abstract and encapsulate cross-cutting concerns.
To add aspects behavior around your code.
To make code modular for cross-cutting concerns to easily maintain and extend it.
To focus on your business logic inside code. This makes code clean. Cross-cutting concerns are encapsulated and maintained separately.