[[bean-eip]]
= Bean EIP
:page-source: core/camel-core-engine/src/main/docs/eips/bean-eip.adoc

The Bean EIP binds beans to Camel message exchanges.

== URI Format

[source]
----
bean:beanID[?options]
----

Where *beanID* can be any string which is used to look up the bean in
the xref:registry.adoc[Registry]

== EIP options

// eip options: START
The Bean EIP supports 4 options which are listed below:

[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *ref* | Sets a reference to a bean to use |  | String
| *method* | Sets the method name on the bean to use |  | String
| *beanType* | Sets the Class of the bean |  | String
| *cache* | Caches the bean lookup, to avoid lookup up bean on every usage. | true | Boolean
|===
// eip options: END

== Bean as endpoint

Camel also supports invoking xref:components::bean-component.adoc[Bean] as an Endpoint. In the
route below:

What happens is that when the exchange is routed to the `myBean` Camel
will use the xref:bean-binding.adoc[Bean Binding] to invoke the bean. +
 The source for the bean is just a plain POJO:

Camel will use xref:bean-binding.adoc[Bean Binding] to invoke the
`sayHello` method, by converting the Exchange's In body to the `String`
type and storing the output of the method on the Exchange Out body.

== Java DSL bean syntax

Java DSL comes with syntactic sugar for the xref:components::bean-component.adoc[Bean]
component. Instead of specifying the bean explicitly as the endpoint
(i.e. `to("bean:beanName")`) you can use the following syntax:

[source,java]
----
// Send message to the bean endpoint
// and invoke method resolved using Bean Binding.
from("direct:start").beanRef("beanName");

// Send message to the bean endpoint
// and invoke given method.
from("direct:start").beanRef("beanName", "methodName");
----

Instead of passing name of the reference to the bean (so that Camel will
lookup for it in the registry), you can specify the bean itself:

[source,java]
----
// Send message to the given bean instance.
from("direct:start").bean(new ExampleBean());

// Explicit selection of bean method to be invoked.
from("direct:start").bean(new ExampleBean(), "methodName");

// Camel will create the instance of bean and cache it for you.
from("direct:start").bean(ExampleBean.class);
----

== Bean binding

How bean methods to be invoked are chosen (if they are not specified
explicitly through the *method* parameter) and how parameter values are
constructed from the xref:message.adoc[Message] are all defined by the
xref:bean-binding.adoc[Bean Binding] mechanism which is used throughout
all of the various xref:bean-integration.adoc[Bean Integration]
mechanisms in Camel.

