An advisor that identifies methods which can be evaluated lazily and advises them. A method can be evaluated lazily
if it returns an interface type and if it throws no checked exceptions. Lazy evaluation should be handled carefully,
as if any of the parameters to a method are mutable, or the internal state of the invoked service changes, the lazily
evaluated results may not match the immediately evaluated result. This effect is greatly exaggerated if the lazy
return object is evaluated in a different thread than when it was generated.
Another consideration is that exceptions that would occur immediately in the non-lazy case are also deferred, often
losing much context in the process.
Use laziness with great care.
Use the
NotLazy
annotation on methods that should not be advised.