Aspect-Oriented Programming (AOP) complements OOP by providing another way of thinking about program structure. While OO decomposes applications into a hierarchy of objects, AOP decomposes programs into aspects or concerns. It is usefull when the system has cross cutting concerns, for example in trasaction and security.
Aspect-oriented software development (AOSD, another name for AOP) helps you design applications in which you implement a single concern (requirement) in one artifact only, known as an aspect, even if the concern is crosscutting (affects multiple artifacts). Here is an article on usage of AOP with jsr168 portlets.