Consistent and efficient access to BeanDefinition argument values

Issue: SPR-16192
This commit is contained in:
Juergen Hoeller
2017-11-13 21:51:11 +01:00
parent e2bb06edbd
commit b5cedd43eb
13 changed files with 195 additions and 116 deletions

View File

@@ -105,16 +105,16 @@ class HandlersBeanDefinitionParser implements BeanDefinitionParser {
private interface HandlerMappingStrategy {
void addMapping(Element mappingElement, ManagedMap<String, Object> map, ParserContext context);
}
private static class WebSocketHandlerMappingStrategy implements HandlerMappingStrategy {
private final RuntimeBeanReference handshakeHandlerReference;
private final ManagedList<?> interceptorsList;
private WebSocketHandlerMappingStrategy(RuntimeBeanReference handshakeHandler, ManagedList<?> interceptors) {
public WebSocketHandlerMappingStrategy(RuntimeBeanReference handshakeHandler, ManagedList<?> interceptors) {
this.handshakeHandlerReference = handshakeHandler;
this.interceptorsList = interceptors;
}
@@ -125,10 +125,10 @@ class HandlersBeanDefinitionParser implements BeanDefinitionParser {
List<String> mappings = Arrays.asList(StringUtils.tokenizeToStringArray(pathAttribute, ","));
RuntimeBeanReference handlerReference = new RuntimeBeanReference(element.getAttribute("handler"));
ConstructorArgumentValues cavs = new ConstructorArgumentValues();
cavs.addIndexedArgumentValue(0, handlerReference);
cavs.addIndexedArgumentValue(1, this.handshakeHandlerReference);
RootBeanDefinition requestHandlerDef = new RootBeanDefinition(WebSocketHttpRequestHandler.class, cavs, null);
ConstructorArgumentValues cargs = new ConstructorArgumentValues();
cargs.addIndexedArgumentValue(0, handlerReference);
cargs.addIndexedArgumentValue(1, this.handshakeHandlerReference);
RootBeanDefinition requestHandlerDef = new RootBeanDefinition(WebSocketHttpRequestHandler.class, cargs, null);
requestHandlerDef.setSource(context.extractSource(element));
requestHandlerDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
requestHandlerDef.getPropertyValues().add("handshakeInterceptors", this.interceptorsList);
@@ -141,12 +141,12 @@ class HandlersBeanDefinitionParser implements BeanDefinitionParser {
}
}
private static class SockJsHandlerMappingStrategy implements HandlerMappingStrategy {
private final RuntimeBeanReference sockJsService;
private SockJsHandlerMappingStrategy(RuntimeBeanReference sockJsService) {
public SockJsHandlerMappingStrategy(RuntimeBeanReference sockJsService) {
this.sockJsService = sockJsService;
}
@@ -156,11 +156,11 @@ class HandlersBeanDefinitionParser implements BeanDefinitionParser {
List<String> mappings = Arrays.asList(StringUtils.tokenizeToStringArray(pathAttribute, ","));
RuntimeBeanReference handlerReference = new RuntimeBeanReference(element.getAttribute("handler"));
ConstructorArgumentValues cavs = new ConstructorArgumentValues();
cavs.addIndexedArgumentValue(0, this.sockJsService, "SockJsService");
cavs.addIndexedArgumentValue(1, handlerReference, "WebSocketHandler");
ConstructorArgumentValues cargs = new ConstructorArgumentValues();
cargs.addIndexedArgumentValue(0, this.sockJsService, "SockJsService");
cargs.addIndexedArgumentValue(1, handlerReference, "WebSocketHandler");
RootBeanDefinition requestHandlerDef = new RootBeanDefinition(SockJsHttpRequestHandler.class, cavs, null);
RootBeanDefinition requestHandlerDef = new RootBeanDefinition(SockJsHttpRequestHandler.class, cargs, null);
requestHandlerDef.setSource(context.extractSource(element));
requestHandlerDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
String requestHandlerName = context.getReaderContext().registerWithGeneratedName(requestHandlerDef);

View File

@@ -243,14 +243,14 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
}
}
}
ConstructorArgumentValues argValues = new ConstructorArgumentValues();
ConstructorArgumentValues cargs = new ConstructorArgumentValues();
if (executor != null) {
executor.getPropertyValues().add("threadNamePrefix", name + "-");
String executorName = name + "Executor";
registerBeanDefByName(executorName, executor, context, source);
argValues.addIndexedArgumentValue(0, new RuntimeBeanReference(executorName));
cargs.addIndexedArgumentValue(0, new RuntimeBeanReference(executorName));
}
RootBeanDefinition channelDef = new RootBeanDefinition(ExecutorSubscribableChannel.class, argValues, null);
RootBeanDefinition channelDef = new RootBeanDefinition(ExecutorSubscribableChannel.class, cargs, null);
ManagedList<? super Object> interceptors = new ManagedList<>();
if (element != null) {
Element interceptorsElement = DomUtils.getChildElementByTagName(element, "interceptors");
@@ -288,11 +288,11 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
stompHandlerDef.getPropertyValues().add("errorHandler", errorHandlerRef);
}
ConstructorArgumentValues cavs = new ConstructorArgumentValues();
cavs.addIndexedArgumentValue(0, inChannel);
cavs.addIndexedArgumentValue(1, outChannel);
ConstructorArgumentValues cargs = new ConstructorArgumentValues();
cargs.addIndexedArgumentValue(0, inChannel);
cargs.addIndexedArgumentValue(1, outChannel);
RootBeanDefinition handlerDef = new RootBeanDefinition(SubProtocolWebSocketHandler.class, cavs, null);
RootBeanDefinition handlerDef = new RootBeanDefinition(SubProtocolWebSocketHandler.class, cargs, null);
handlerDef.getPropertyValues().addPropertyValue("protocolHandlers", stompHandlerDef);
registerBeanDefByName(WEB_SOCKET_HANDLER_BEAN_NAME, handlerDef, context, source);
RuntimeBeanReference result = new RuntimeBeanReference(WEB_SOCKET_HANDLER_BEAN_NAME);
@@ -329,10 +329,10 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
element, SCHEDULER_BEAN_NAME, cxt, source);
if (sockJsService != null) {
ConstructorArgumentValues cavs = new ConstructorArgumentValues();
cavs.addIndexedArgumentValue(0, sockJsService);
cavs.addIndexedArgumentValue(1, subProtoHandler);
beanDef = new RootBeanDefinition(SockJsHttpRequestHandler.class, cavs, null);
ConstructorArgumentValues cargs = new ConstructorArgumentValues();
cargs.addIndexedArgumentValue(0, sockJsService);
cargs.addIndexedArgumentValue(1, subProtoHandler);
beanDef = new RootBeanDefinition(SockJsHttpRequestHandler.class, cargs, null);
// Register alias for backwards compatibility with 4.1
cxt.getRegistry().registerAlias(SCHEDULER_BEAN_NAME, SOCKJS_SCHEDULER_BEAN_NAME);
@@ -344,10 +344,10 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
String allowedOrigins = element.getAttribute("allowed-origins");
List<String> origins = Arrays.asList(StringUtils.tokenizeToStringArray(allowedOrigins, ","));
interceptors.add(new OriginHandshakeInterceptor(origins));
ConstructorArgumentValues cavs = new ConstructorArgumentValues();
cavs.addIndexedArgumentValue(0, subProtoHandler);
cavs.addIndexedArgumentValue(1, handler);
beanDef = new RootBeanDefinition(WebSocketHttpRequestHandler.class, cavs, null);
ConstructorArgumentValues cargs = new ConstructorArgumentValues();
cargs.addIndexedArgumentValue(0, subProtoHandler);
cargs.addIndexedArgumentValue(1, handler);
beanDef = new RootBeanDefinition(WebSocketHttpRequestHandler.class, cargs, null);
beanDef.getPropertyValues().add("handshakeInterceptors", interceptors);
}
return new RuntimeBeanReference(registerBeanDef(beanDef, cxt, source));
@@ -361,16 +361,16 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
Element simpleBrokerElem = DomUtils.getChildElementByTagName(brokerElement, "simple-broker");
Element brokerRelayElem = DomUtils.getChildElementByTagName(brokerElement, "stomp-broker-relay");
ConstructorArgumentValues cavs = new ConstructorArgumentValues();
cavs.addIndexedArgumentValue(0, inChannel);
cavs.addIndexedArgumentValue(1, outChannel);
cavs.addIndexedArgumentValue(2, brokerChannel);
ConstructorArgumentValues cargs = new ConstructorArgumentValues();
cargs.addIndexedArgumentValue(0, inChannel);
cargs.addIndexedArgumentValue(1, outChannel);
cargs.addIndexedArgumentValue(2, brokerChannel);
RootBeanDefinition brokerDef;
if (simpleBrokerElem != null) {
String prefix = simpleBrokerElem.getAttribute("prefix");
cavs.addIndexedArgumentValue(3, Arrays.asList(StringUtils.tokenizeToStringArray(prefix, ",")));
brokerDef = new RootBeanDefinition(SimpleBrokerMessageHandler.class, cavs, null);
cargs.addIndexedArgumentValue(3, Arrays.asList(StringUtils.tokenizeToStringArray(prefix, ",")));
brokerDef = new RootBeanDefinition(SimpleBrokerMessageHandler.class, cargs, null);
if (brokerElement.hasAttribute("path-matcher")) {
String pathMatcherRef = brokerElement.getAttribute("path-matcher");
brokerDef.getPropertyValues().add("pathMatcher", new RuntimeBeanReference(pathMatcherRef));
@@ -386,7 +386,7 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
}
else if (brokerRelayElem != null) {
String prefix = brokerRelayElem.getAttribute("prefix");
cavs.addIndexedArgumentValue(3, Arrays.asList(StringUtils.tokenizeToStringArray(prefix, ",")));
cargs.addIndexedArgumentValue(3, Arrays.asList(StringUtils.tokenizeToStringArray(prefix, ",")));
MutablePropertyValues values = new MutablePropertyValues();
if (brokerRelayElem.hasAttribute("relay-host")) {
@@ -431,7 +431,7 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
values.add("systemSubscriptions", map);
}
Class<?> handlerType = StompBrokerRelayMessageHandler.class;
brokerDef = new RootBeanDefinition(handlerType, cavs, values);
brokerDef = new RootBeanDefinition(handlerType, cargs, values);
}
else {
// Should not happen
@@ -487,9 +487,9 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
converters.add(jacksonConverterDef);
}
}
ConstructorArgumentValues cavs = new ConstructorArgumentValues();
cavs.addIndexedArgumentValue(0, converters);
RootBeanDefinition messageConverterDef = new RootBeanDefinition(CompositeMessageConverter.class, cavs, null);
ConstructorArgumentValues cargs = new ConstructorArgumentValues();
cargs.addIndexedArgumentValue(0, converters);
RootBeanDefinition messageConverterDef = new RootBeanDefinition(CompositeMessageConverter.class, cargs, null);
String name = MESSAGE_CONVERTER_BEAN_NAME;
registerBeanDefByName(name, messageConverterDef, context, source);
return new RuntimeBeanReference(name);
@@ -498,9 +498,9 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
private RuntimeBeanReference registerMessagingTemplate(Element element, RuntimeBeanReference brokerChannel,
RuntimeBeanReference messageConverter, ParserContext context, @Nullable Object source) {
ConstructorArgumentValues cavs = new ConstructorArgumentValues();
cavs.addIndexedArgumentValue(0, brokerChannel);
RootBeanDefinition beanDef = new RootBeanDefinition(SimpMessagingTemplate.class,cavs, null);
ConstructorArgumentValues cargs = new ConstructorArgumentValues();
cargs.addIndexedArgumentValue(0, brokerChannel);
RootBeanDefinition beanDef = new RootBeanDefinition(SimpMessagingTemplate.class, cargs, null);
if (element.hasAttribute("user-destination-prefix")) {
beanDef.getPropertyValues().add("userDestinationPrefix", element.getAttribute("user-destination-prefix"));
}
@@ -515,17 +515,17 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
RuntimeBeanReference converter, RuntimeBeanReference messagingTemplate,
ParserContext context, @Nullable Object source) {
ConstructorArgumentValues cavs = new ConstructorArgumentValues();
cavs.addIndexedArgumentValue(0, inChannel);
cavs.addIndexedArgumentValue(1, outChannel);
cavs.addIndexedArgumentValue(2, messagingTemplate);
ConstructorArgumentValues cargs = new ConstructorArgumentValues();
cargs.addIndexedArgumentValue(0, inChannel);
cargs.addIndexedArgumentValue(1, outChannel);
cargs.addIndexedArgumentValue(2, messagingTemplate);
MutablePropertyValues values = new MutablePropertyValues();
String prefixAttribute = messageBrokerElement.getAttribute("application-destination-prefix");
values.add("destinationPrefixes", Arrays.asList(StringUtils.tokenizeToStringArray(prefixAttribute, ",")));
values.add("messageConverter", converter);
RootBeanDefinition beanDef = new RootBeanDefinition(WebSocketAnnotationMethodMessageHandler.class, cavs, values);
RootBeanDefinition beanDef = new RootBeanDefinition(WebSocketAnnotationMethodMessageHandler.class, cargs, values);
if (messageBrokerElement.hasAttribute("path-matcher")) {
String pathMatcherRef = messageBrokerElement.getAttribute("path-matcher");
beanDef.getPropertyValues().add("pathMatcher", new RuntimeBeanReference(pathMatcherRef));