架构

Bean 集成

师成师成· 更新于 2026-09-28· 阅读 12 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

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 消息示例。

使用 @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>> 这样的嵌套复杂类型。

另请参阅

评论

登录后参与评论

正在加载评论…