Bean 集成
Bean 集成
Camel 支持以多种方式集成 Bean 和 POJO。
注解
如果某个 Bean 是在 Spring XML 中定义的,或是通过 Spring 的组件扫描机制扫描得到的,并且使用了 <camelContext> 或 CamelBeanPostProcessor,那么我们会处理一系列 Camel 注解,以完成注入资源、生产、消费或路由消息等各种操作。
以下注解由 Camel 的 CamelBeanPostProcessor 支持并注入。
| 注解 | 说明 |
|---|---|
@EndpointInject | 用于注入端点,详情参见 POJO 产生。 |
@BeanInject | 用于注入从 Registry 中获取的 bean。参见 Bean 注入。 |
@BeanConfigInject | 用于注入从 Registry 中获取的配置 bean。该 bean 是一个表示一组配置选项的 POJO,会自动使用通过 Camel 属性占位符 加载的值进行配置。 |
@PropertyInject | 用于使用属性占位符注入值。 |
@Produce | 用于注入一个生产者,以便向端点发送消息。参见 POJO 产生。 |
@Consume | 用于在方法上注入一个消费者。参见 POJO 消费。 |
@BindToRegistry | 用于将 bean 绑定到 registry。如果未指定名称,则会根据配置该注解的类名、字段名或方法名自动计算出 bean 的名称。 |
@DeferredContextBinding | 用于表示:如果目标类型是 CamelContextAware,则 CamelContext 会被延迟注入,即在 Camel 引导完成之后再注入,此时 CamelContext 已就绪可用。 |
更多详情请参阅:
- POJO 消费,从 Camel 消费并可能路由消息
- POJO 生产,便于从你的 POJO 中生产 Camel 消息
@DynamicRouter注解,用于通过 POJO 方法创建动态路由器@RecipientList注解,用于通过 POJO 方法创建接收者列表@RoutingSlip注解,用于为 POJO 方法创建路由滑块- Bean 注入,将 Camel 相关资源注入到你的 POJO 中
- 使用 Exchange 模式注解 描述了如何使用模式注解来改变 Spring Remoting 或 POJO 生产中方法调用的行为
示例
有关如何使用这些注解进行路由和消息传递,请参阅 POJO 消息示例。
使用 @PropertyInject
Camel 允许使用 @PropertyInject 注解在 POJO 中注入属性占位符,该注解可以设置在字段和 setter 方法上。例如,你可以在 RouteBuilder 类中使用它,如下所示:
仅 Java:使用 @PropertyInject 注入属性占位符的值
public class MyRouteBuilder extends RouteBuilder {
@PropertyInject("hello")
private String greeting;
@Override
public void configure() throws Exception {
from("direct:start")
.transform().constant(greeting)
.to("{{result}}");
}
}请注意,我们用 @PropertyInject 注解了 greeting 字段,并指定它使用 hello 这个键。随后 Camel 会查找该键对应的属性,并将其值注入进来,转换为 String 类型。
你也可以在键中使用多个占位符和文本,例如:
仅 Java:在 @PropertyInject 中使用多个占位符和文本
@PropertyInject("Hello {{name}} how are you?")
private String greeting;这将查找键为 name 的占位符。
如果该键不存在,你也可以添加一个默认值,例如:
仅 Java:在 @PropertyInject 中使用默认值
@PropertyInject(value = "myTimeout", defaultValue = "5000")
private int timeout;使用 @PropertyInject 注入数组、列表、Set 或 Map
你也可以使用 @PropertyInject 注入一组值。例如,你可能在配置文件中配置了多个主机名,并需要将它们注入到 String[] 或 List<String> 字段中。为此,你需要告知 Camel 该属性值应使用分隔符进行拆分,如下所示:
仅 Java:使用分隔符注入一组值
@PropertyInject(value = "myHostnames", separator = ",")
private String[] servers;你也可以使用列表/集合类型,例如 List<String> 或 Set<String>,来代替数组。 |
|---|
然后在 application.properties 文件中,你可以定义服务器:
myHostnames = serverA, serverB, serverC这同样适用于非字符串类型的字段,例如用于数值的 int[]。 |
|---|
对于 Map 类型,值应采用 key=value 的格式,例如:
myServers = serverA=http://coolstore:4444,serverB=http://megastore:5555然后,你可以按如下方式将其注入到一个 Map 中:
仅限 Java:将键值对注入 Map
@PropertyInject(value = "myServers", separator = ",")
private Map servers;你可以在 Map 中使用泛型,例如让其值为 Integer 类型:
仅限 Java:注入带类型值的 Map
@PropertyInject(value = "ports", separator = ",")
private Map<String, Integer> ports;泛型类型只能是单个类类型,不能是诸如 Map<String,Map<Kind,Priority>> 这样的嵌套复杂类型。 |
|---|
另请参阅
评论
登录后参与评论
KnowForge