訊息元註解
從 4.0 版本開始,所有訊息傳遞註解都可以配置為元註解,並且所有使用者定義的訊息傳遞註解都可以定義相同的屬性以覆蓋其預設值。此外,元註解可以分層配置,如下例所示
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@ServiceActivator(inputChannel = "annInput", outputChannel = "annOutput")
public @interface MyServiceActivator {
String[] adviceChain = { "annAdvice" };
}
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@MyServiceActivator
public @interface MyServiceActivator1 {
String inputChannel();
String outputChannel();
}
...
@MyServiceActivator1(inputChannel = "inputChannel", outputChannel = "outputChannel")
public Object service(Object payload) {
...
}
分層配置元註解允許使用者為各種屬性設定預設值,並實現框架 Java 依賴項與使用者註解的隔離,避免在使用者類中使用它們。如果框架發現一個帶有使用者註解的方法,而該使用者註解又帶有一個框架元註解,那麼它的處理方式就像該方法直接使用框架註解進行註解一樣。
@Bean 方法上的註解
從 4.0 版本開始,您可以在 @Configuration 類中的 @Bean 方法定義上配置訊息傳遞註解,以基於 Bean 而不是方法生成訊息端點。當 @Bean 定義是“開箱即用”的 MessageHandler 例項(AggregatingMessageHandler、DefaultMessageSplitter 等)、Transformer 例項(JsonToObjectTransformer、ClaimCheckOutTransformer 等)和 MessageSource 例項(FileReadingMessageSource、RedisStoreMessageSource 等)時,這非常有用。以下示例展示瞭如何將訊息傳遞註解與 @Bean 註解一起使用
@Configuration
@EnableIntegration
public class MyFlowConfiguration {
@Bean
@InboundChannelAdapter(value = "inputChannel", poller = @Poller(fixedDelay = "1000"))
public MessageSource<String> consoleSource() {
return CharacterStreamReadingMessageSource.stdin();
}
@Bean
@Transformer(inputChannel = "inputChannel", outputChannel = "httpChannel")
public ObjectToMapTransformer toMapTransformer() {
return new ObjectToMapTransformer();
}
@Bean
@ServiceActivator(inputChannel = "httpChannel")
public HttpRequestExecutingMessageHandler httpHandler() {
HttpRequestExecutingMessageHandler handler = new HttpRequestExecutingMessageHandler("https://foo/service");
handler.setExpectedResponseType(String.class);
handler.setOutputChannelName("outputChannel");
return handler;
}
@Bean
@ServiceActivator(inputChannel = "outputChannel")
public LoggingHandler loggingHandler() {
return new LoggingHandler("info");
}
}
5.0 版本引入了對用 @InboundChannelAdapter 註解的 @Bean 的支援,該註解返回 java.util.function.Supplier,它可以生成 POJO 或 Message。以下示例展示瞭如何使用這種組合
@Configuration
@EnableIntegration
public class MyFlowConfiguration {
@Bean
@InboundChannelAdapter(value = "inputChannel", poller = @Poller(fixedDelay = "1000"))
public Supplier<String> pojoSupplier() {
return () -> "foo";
}
@Bean
@InboundChannelAdapter(value = "inputChannel", poller = @Poller(fixedDelay = "1000"))
public Supplier<Message<String>> messageSupplier() {
return () -> new GenericMessage<>("foo");
}
}
元註解規則也適用於 @Bean 方法(前面描述的 @MyServiceActivator 註解可以應用於 @Bean 定義)。
當您在消費者 @Bean 定義上使用這些註解時,如果 Bean 定義返回適當的 MessageHandler(取決於註解型別),您必須在 MessageHandler @Bean 定義本身上設定屬性(例如 outputChannel、requiresReply、order 等)。只使用以下註解屬性:adviceChain、autoStartup、inputChannel、phase 和 poller。所有其他屬性都適用於處理器。 |
| Bean 名稱使用以下演算法生成 |
-
MessageHandler(MessageSource)@Bean從方法名稱或@Bean上的name屬性獲取其標準名稱。這就像@Bean方法上沒有訊息傳遞註解一樣。 -
AbstractEndpointBean 名稱使用以下模式生成:[@Bean 名稱].[decapitalizedAnnotationClassShortName]。例如,前面顯示的consoleSource()定義的SourcePollingChannelAdapter端點獲取的 Bean 名稱為consoleSource.inboundChannelAdapter。與 POJO 方法不同,Bean 方法名稱不包含在端點 Bean 名稱中。另請參閱端點 Bean 名稱。 -
如果
@Bean不能直接用於目標端點(不是MessageSource、AbstractReplyProducingMessageHandler或AbstractMessageRouter的例項),則會註冊一個相應的AbstractStandardMessageHandlerFactoryBean來委託給此@Bean。此包裝器的 Bean 名稱使用以下模式生成:[@Bean 名稱].[decapitalizedAnnotationClassShortName].[handler (或 source)]。
當在 @Bean 定義上使用這些註解時,inputChannel 必須引用一個已宣告的 Bean。如果應用程式上下文中尚不存在通道,則會自動宣告通道。 |
|
透過 Java 配置,您可以在
結合現有的 Spring 容器邏輯,訊息端點 Bean(基於 |
使用註解建立橋接
從 4.0 版本開始,Java 配置提供了 @BridgeFrom 和 @BridgeTo @Bean 方法註解,用於在 @Configuration 類中標記 MessageChannel Bean。這些註解的出現是為了完整性,提供了一種方便的機制來宣告 BridgeHandler 及其訊息端點配置
@Bean
public PollableChannel bridgeFromInput() {
return new QueueChannel();
}
@Bean
@BridgeFrom(value = "bridgeFromInput", poller = @Poller(fixedDelay = "1000"))
public MessageChannel bridgeFromOutput() {
return new DirectChannel();
}
@Bean
public QueueChannel bridgeToOutput() {
return new QueueChannel();
}
@Bean
@BridgeTo("bridgeToOutput")
public MessageChannel bridgeToInput() {
return new DirectChannel();
}
您也可以將這些註解用作元註解。
建議註解端點
請參閱使用註解建議端點。