Are aspects always optional or non-functional parts of a program?
No. Although AspectJ can be used in a way that allows AspectJ code to be removed for the final build, aspect-oriented code is not always optional or non-functional. Consider what AOP really does: it makes the modules in a program correspond to modules in the design. In any given design, some modules are optional, and some are not. The examples directory included in the AspectJ distribution contains some examples of the use aspects that are not optional.