[[commands-registration-programmatic]]
= Programmatic

ifndef::snippets[:snippets: ../../test/java/org/springframework/shell/docs]

In the programmatic model, `CommandRegistration` can be defined as a `@Bean`
and it will be automatically registered.

[source, java, indent=0]
----
include::{snippets}/CommandRegistrationBeanSnippets.java[tag=plain]
----

If all your commands have something in common, an instance of
a _CommandRegistration.BuilderSupplier_ is created which can
be autowired. Default implementation of this supplier returns
a new builder so you don't need to worry about its internal state.

IMPORTANT: Commands registered programmatically automatically
add _help options_ mentioned in xref:using-shell-commands-helpoptions.adoc[Help Options].

If bean of this supplier type is defined then auto-configuration
will back off giving you an option to redefine default functionality.

[source, java, indent=0]
----
include::{snippets}/CommandRegistrationBeanSnippets.java[tag=fromsupplier]
----

`CommandRegistrationCustomizer` beans can be defined if you want to centrally
modify builder instance given you by supplier mentioned above.

[source, java, indent=0]
----
include::{snippets}/CommandRegistrationBeanSnippets.java[tag=customizer]
----
