This document discusses aspect-oriented programming (AOP) and AspectJ. AOP aims to increase modularity by separating cross-cutting concerns from core functionality. AspectJ is a popular AOP extension for Java. It allows defining aspects that specify where advice code should run via pointcuts. Advice like before, after returning, etc. can add behavior without modifying the original code. AspectJ compiles aspects and application code together or weaves aspects into existing binaries at compile-time, post-compile, or load-time. Examples demonstrate logging and profiling cross-cutting concerns using aspects.