# Annotation Interface ComponentType

@Retention(RUNTIME) @Target(METHOD) @Incubating public @interface ComponentType
Declares a custom `ComponentSpec` type. The following example demonstrates how to register a custom component type using a plugin with a `ComponentType` annotation. Furthermore the plugin creates an instance of SampleComponent named 'sampleComponent'.

    interface SampleComponent extends ComponentSpec {}
    class DefaultSampleComponent extends BaseComponentSpec implements SampleComponent {}

    apply plugin: MySamplePlugin

    class MySamplePlugin extends RuleSource {
        @ComponentType
        void register(TypeBuilder<SampleComponent> builder) {
            builder.defaultImplementation(DefaultSampleComponent)
        }

        @Mutate
        void createSampleLibraryComponents(ModelMap<SampleComponent> componentSpecs) {
            componentSpecs.create("sampleComponent")
        }
    }