facet classafIoc::Advise

sys::Obj
  afIoc::Advise : sys::Facet

@Serializable

Use in a module class to denote a service advisor method.

Advisor methods let you intercept method calls to a mixin fronted service, allowing you to

  • perform pre & post method logic
  • change the method arguments
  • change the return value
  • catch and process any thrown Errs
  • ignore the method call
  • do something else entirely!

The serviceId argument is a glob pattern and is matched against all service ids in the registry. This allows a single advisor method to match and advise multiple services. e.g. to advise all DAOs you might define:

@Advise { serviceId="*DAO" } 

The advisor method may be called anything you like. The first argument needs to be a list of MethodAdvisor, any other arguments are taken to be dependent services and are injected as such.

e.g. the following module method adds transaction commit / rollback code to all saveXXX() methods on all DAO services.

@Advise { serviceId="*DAO" }
static Void addTransations(MethodAdvisor[] methodAdvisors, MyTransactionManager transManager) {
    methodAdvisors
        .findAll { it.method.name.startsWith("save") }
        .each |advisor| { 
            advisor.addAdvice |invocation -> Obj?| { 
                
                // my advice code
                transManager.startTransaction()
                try {
                    retValue := invocation.invoke
                    transManager.commit()
                    return retValue
                } catch (Err e) {
                    transManager.rollback()
                    throw e
                }
            } 
        }
}

Note you can only advise services that are defined by a mixin, as the advice mechanism makes use of proxies.

@since 1.3.0

serviceId

Source

const Str serviceId := "*"

The glob pattern to match against all service ids.

Default value is "*", that is, match ALL services.