[[ConfiguringCamel-ConfiguringCamel]]
=== Configuring Camel

[[ConfiguringCamel-HowdoIaddacomponent]]
==== How do I add a component?

You might first want to read link:writing-components.adoc[Writing
Components] for a background in how to implement a new component.
Typically it means you write an implementation of the
http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/Component.html[Component]
interface, usually deriving from
http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/impl/DefaultComponent.html[DefaultComponent].

You can then register your component explicitly via:

[source,java]
----
CamelContext context = new DefaultCamelContext();
context.addComponent("foo", new FooComponent(context));
----

However you can use the auto-discovery feature of Camel where by Camel
will automatically add a link:component.adoc[Component] when an endpoint
URI is used. To do this you would create a file called:

....
/META-INF/services/org/apache/camel/component/foo
....

with contents:

[source,java]
----
class=org.acme.FooComponent
----

(You can add other property configurations in there too if you like.)

Then if you refer to an endpoint as `foo://somethingOrOther` Camel
will auto-discover your component and register it.

The `FooComponent` can then be auto-injected with resources using the
http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/spi/Injector.html[Injector],
such as to support link:spring.adoc[Spring] based auto-wiring, or to
support `@Resource` (EJB3 style) injection or Guice style `@Inject`
injection.


[[ConfiguringCamel-WorkingwithSpringXML]]
==== Working with Spring XML

You can configure a component via Spring using the following mechanism:

include::../../../components/camel-jms/src/test/resources/org/apache/camel/component/jms/jmsRouteUsingSpring.xml[]

Which allows you to configure a component using some name (activemq in the
above example), then you can refer to the component using
`activemq:[queue:|topic:]destinationName`.

If you want to add explicit Spring 2.x XML objects to your XML then you
could use the `xbean-spring` which tries to automate most of the XML
binding work for you; or you could look in camel-spring
at `CamelNamespaceHandler` you'll see how we handle the Spring XML
stuff (warning it's kinda hairy code to look at :smile:).
If you wanted `<fooComponent>` to be a standard part of the core Camel
schema then you'd hack that file to add your component &
link:contributing.adoc[contribute a patch] to the camel XSD. Otherwise
you could write your own namespace & schema if you prefer.


[[ConfiguringCamel-SeeAlso]]
==== See Also

* link:writing-components.adoc[Writing Components]
* link:how-do-i-configure-endpoints.adoc[How do I configure endpoints?]
