[[BeanIntegration-BeanIntegration]]
= Bean Integration

Camel supports the integration of beans and POJOs in a number of ways

[[BeanIntegration-Annotations]]
== Annotations

If a bean is defined in Spring XML or scanned using
the Spring component scanning mechanism and a *<camelContext>* is used
or a `CamelBeanPostProcessor` then we process a number of Camel
annotations to do various things such as injecting resources or
producing, consuming or routing messages.

The following annotations is supported and inject by Camel's
`CamelBeanPostProcessor`

[width="100%",cols="10%,90%",options="header",]
|=======================================================================
|Annotation |Description
|`@EndpointInject` |To inject an endpoint, see more details at xref:pojo-producing.adoc[POJO Producing].
|`@BeanInject` |To inject a bean obtained from the Registry. See xref:bean-injection.adoc[Bean Injection].
|`@PropertyInject` |To inject a value using property placeholder.
|`@Produce` |To inject a producer to send message to an endpoint. See xref:pojo-producing.adoc[POJO Producing].
|`@Consume` |To inject a consumer on a method. See xref:pojo-consuming.adoc[POJO Consuming].
|`@BindToRegistry` |Used for binding a bean to the registry.
  If no name is specified then the bean will have its name auto computed based on the class name,
 field name, or method name where the annotation is configured.
|=======================================================================

See more details at:

* xref:pojo-consuming.adoc[POJO Consuming] to consume and possibly route messages from Camel
* xref:pojo-producing.adoc[POJO Producing] to make it easy to produce camel messages from your POJOs
* `@DynamicRouter` Annotation for creating a xref:{eip-vc}:eips:dynamic-router.adoc[Dynamic Router] from a POJO method
* `@RecipientList` Annotation for creating a xref:{eip-vc}:eips:recipientList-eip.adoc[Recipient List] from a POJO method
* `@RoutingSlip` Annotation for creating a xref:{eip-vc}:eips:routingSlip-eip.adoc[Routing Slip] for a POJO method
* xref:bean-injection.adoc[Bean Injection] to inject Camel related resources into your POJOs
* xref:using-exchange-pattern-annotations.adoc[Using Exchange Pattern Annotations]
  describes how the pattern annotations can be used to change
  the behaviour of method invocations with Spring Remoting or POJO Producing

*Example*

See the https://github.com/apache/camel-examples/tree/master/examples/camel-example-pojo-messaging[POJO Messaging Example]
for how to use the annotations for routing and messaging.

[[BeanIntegration-BeanComponent]]
== Bean Component

The xref:components::bean-component.adoc[Bean] component allows one to invoke a particular
method. Alternately the xref:components::bean-component.adoc[Bean] component supports the
creation of a proxy via `ProxyHelper` to a Java interface; which allows to hide sending data
to the endpoint via an interface. See more at xref:hiding-middleware.adoc[Hiding Middleware].

[[BeanIntegration-SpringRemoting]]
== Spring Remoting

We support a Spring Remoting provider which
uses Camel as the underlying transport mechanism. The nice thing about
this approach is we can use any of the Camel transport
Components to communicate between beans. It also
means we can use Content Based Router
and the other xref:{eip-vc}:eips:enterprise-integration-patterns.adoc[Enterprise
Integration Patterns] in between the beans; in particular we can use
Message Translator to be able to convert
what the on-the-wire messages look like in addition to adding various
headers and so forth.

*Bean binding*

Whenever Camel invokes a bean method via one of the above methods
(xref:components::bean-component.adoc[Bean] component, xref:spring-remoting.adoc[Spring
Remoting] or POJO Consuming) then the
*Bean Binding* mechanism is used to figure out
what method to use (if it is not explicit) and how to bind the
Message to the parameters possibly using the
Parameter Binding Annotations
or using a method name option.
