19
19
import java .util .LinkedHashMap ;
20
20
import java .util .Map ;
21
21
22
+ import org .springframework .beans .factory .BeanFactory ;
22
23
import org .springframework .beans .factory .config .BeanDefinition ;
23
24
import org .springframework .beans .factory .config .RuntimeBeanReference ;
24
25
import org .springframework .beans .factory .parsing .BeanComponentDefinition ;
26
+ import org .springframework .beans .factory .support .BeanDefinitionRegistry ;
25
27
import org .springframework .beans .factory .support .RootBeanDefinition ;
26
28
import org .springframework .beans .factory .xml .ParserContext ;
27
29
import org .springframework .lang .Nullable ;
43
45
* Convenience methods for use in MVC namespace BeanDefinitionParsers.
44
46
*
45
47
* @author Rossen Stoyanchev
48
+ * @author Juergen Hoeller
46
49
* @author Brian Clozel
47
50
* @author Marten Deinum
48
51
* @since 3.1
@@ -67,15 +70,15 @@ public abstract class MvcNamespaceUtils {
67
70
private static final String HANDLER_MAPPING_INTROSPECTOR_BEAN_NAME = "mvcHandlerMappingIntrospector" ;
68
71
69
72
70
- public static void registerDefaultComponents (ParserContext parserContext , @ Nullable Object source ) {
71
- registerBeanNameUrlHandlerMapping (parserContext , source );
72
- registerHttpRequestHandlerAdapter (parserContext , source );
73
- registerSimpleControllerHandlerAdapter (parserContext , source );
74
- registerHandlerMappingIntrospector (parserContext , source );
75
- registerThemeResolver ( parserContext , source );
76
- registerLocaleResolver ( parserContext , source );
77
- registerFlashMapManager ( parserContext , source );
78
- registerViewNameTranslator ( parserContext , source );
73
+ public static void registerDefaultComponents (ParserContext context , @ Nullable Object source ) {
74
+ registerBeanNameUrlHandlerMapping (context , source );
75
+ registerHttpRequestHandlerAdapter (context , source );
76
+ registerSimpleControllerHandlerAdapter (context , source );
77
+ registerHandlerMappingIntrospector (context , source );
78
+ registerLocaleResolver ( context , source );
79
+ registerThemeResolver ( context , source );
80
+ registerViewNameTranslator ( context , source );
81
+ registerFlashMapManager ( context , source );
79
82
}
80
83
81
84
/**
@@ -84,21 +87,21 @@ public static void registerDefaultComponents(ParserContext parserContext, @Nulla
84
87
* @return a RuntimeBeanReference to this {@link UrlPathHelper} instance
85
88
*/
86
89
public static RuntimeBeanReference registerUrlPathHelper (
87
- @ Nullable RuntimeBeanReference urlPathHelperRef , ParserContext parserContext , @ Nullable Object source ) {
90
+ @ Nullable RuntimeBeanReference urlPathHelperRef , ParserContext context , @ Nullable Object source ) {
88
91
89
92
if (urlPathHelperRef != null ) {
90
- if (parserContext .getRegistry ().isAlias (URL_PATH_HELPER_BEAN_NAME )) {
91
- parserContext .getRegistry ().removeAlias (URL_PATH_HELPER_BEAN_NAME );
93
+ if (context .getRegistry ().isAlias (URL_PATH_HELPER_BEAN_NAME )) {
94
+ context .getRegistry ().removeAlias (URL_PATH_HELPER_BEAN_NAME );
92
95
}
93
- parserContext .getRegistry ().registerAlias (urlPathHelperRef .getBeanName (), URL_PATH_HELPER_BEAN_NAME );
96
+ context .getRegistry ().registerAlias (urlPathHelperRef .getBeanName (), URL_PATH_HELPER_BEAN_NAME );
94
97
}
95
- else if (!parserContext .getRegistry ().isAlias (URL_PATH_HELPER_BEAN_NAME ) &&
96
- !parserContext .getRegistry ().containsBeanDefinition (URL_PATH_HELPER_BEAN_NAME )) {
98
+ else if (!context .getRegistry ().isAlias (URL_PATH_HELPER_BEAN_NAME ) &&
99
+ !context .getRegistry ().containsBeanDefinition (URL_PATH_HELPER_BEAN_NAME )) {
97
100
RootBeanDefinition urlPathHelperDef = new RootBeanDefinition (UrlPathHelper .class );
98
101
urlPathHelperDef .setSource (source );
99
102
urlPathHelperDef .setRole (BeanDefinition .ROLE_INFRASTRUCTURE );
100
- parserContext .getRegistry ().registerBeanDefinition (URL_PATH_HELPER_BEAN_NAME , urlPathHelperDef );
101
- parserContext .registerComponent (new BeanComponentDefinition (urlPathHelperDef , URL_PATH_HELPER_BEAN_NAME ));
103
+ context .getRegistry ().registerBeanDefinition (URL_PATH_HELPER_BEAN_NAME , urlPathHelperDef );
104
+ context .registerComponent (new BeanComponentDefinition (urlPathHelperDef , URL_PATH_HELPER_BEAN_NAME ));
102
105
}
103
106
return new RuntimeBeanReference (URL_PATH_HELPER_BEAN_NAME );
104
107
}
@@ -109,21 +112,21 @@ else if (!parserContext.getRegistry().isAlias(URL_PATH_HELPER_BEAN_NAME) &&
109
112
* @return a RuntimeBeanReference to this {@link PathMatcher} instance
110
113
*/
111
114
public static RuntimeBeanReference registerPathMatcher (@ Nullable RuntimeBeanReference pathMatcherRef ,
112
- ParserContext parserContext , @ Nullable Object source ) {
115
+ ParserContext context , @ Nullable Object source ) {
113
116
114
117
if (pathMatcherRef != null ) {
115
- if (parserContext .getRegistry ().isAlias (PATH_MATCHER_BEAN_NAME )) {
116
- parserContext .getRegistry ().removeAlias (PATH_MATCHER_BEAN_NAME );
118
+ if (context .getRegistry ().isAlias (PATH_MATCHER_BEAN_NAME )) {
119
+ context .getRegistry ().removeAlias (PATH_MATCHER_BEAN_NAME );
117
120
}
118
- parserContext .getRegistry ().registerAlias (pathMatcherRef .getBeanName (), PATH_MATCHER_BEAN_NAME );
121
+ context .getRegistry ().registerAlias (pathMatcherRef .getBeanName (), PATH_MATCHER_BEAN_NAME );
119
122
}
120
- else if (!parserContext .getRegistry ().isAlias (PATH_MATCHER_BEAN_NAME ) &&
121
- !parserContext .getRegistry ().containsBeanDefinition (PATH_MATCHER_BEAN_NAME )) {
123
+ else if (!context .getRegistry ().isAlias (PATH_MATCHER_BEAN_NAME ) &&
124
+ !context .getRegistry ().containsBeanDefinition (PATH_MATCHER_BEAN_NAME )) {
122
125
RootBeanDefinition pathMatcherDef = new RootBeanDefinition (AntPathMatcher .class );
123
126
pathMatcherDef .setSource (source );
124
127
pathMatcherDef .setRole (BeanDefinition .ROLE_INFRASTRUCTURE );
125
- parserContext .getRegistry ().registerBeanDefinition (PATH_MATCHER_BEAN_NAME , pathMatcherDef );
126
- parserContext .registerComponent (new BeanComponentDefinition (pathMatcherDef , PATH_MATCHER_BEAN_NAME ));
128
+ context .getRegistry ().registerBeanDefinition (PATH_MATCHER_BEAN_NAME , pathMatcherDef );
129
+ context .registerComponent (new BeanComponentDefinition (pathMatcherDef , PATH_MATCHER_BEAN_NAME ));
127
130
}
128
131
return new RuntimeBeanReference (PATH_MATCHER_BEAN_NAME );
129
132
}
@@ -204,70 +207,72 @@ else if (corsConfigurations != null) {
204
207
* Registers an {@link HandlerMappingIntrospector} under a well-known name
205
208
* unless already registered.
206
209
*/
207
- private static void registerHandlerMappingIntrospector (ParserContext parserContext , @ Nullable Object source ) {
208
- if (!parserContext .getRegistry ().containsBeanDefinition (HANDLER_MAPPING_INTROSPECTOR_BEAN_NAME )) {
210
+ private static void registerHandlerMappingIntrospector (ParserContext context , @ Nullable Object source ) {
211
+ if (!context .getRegistry ().containsBeanDefinition (HANDLER_MAPPING_INTROSPECTOR_BEAN_NAME )) {
209
212
RootBeanDefinition beanDef = new RootBeanDefinition (HandlerMappingIntrospector .class );
210
213
beanDef .setSource (source );
211
214
beanDef .setRole (BeanDefinition .ROLE_INFRASTRUCTURE );
212
215
beanDef .setLazyInit (true );
213
- parserContext .getRegistry ().registerBeanDefinition (HANDLER_MAPPING_INTROSPECTOR_BEAN_NAME , beanDef );
214
- parserContext .registerComponent (new BeanComponentDefinition (beanDef , HANDLER_MAPPING_INTROSPECTOR_BEAN_NAME ));
216
+ context .getRegistry ().registerBeanDefinition (HANDLER_MAPPING_INTROSPECTOR_BEAN_NAME , beanDef );
217
+ context .registerComponent (new BeanComponentDefinition (beanDef , HANDLER_MAPPING_INTROSPECTOR_BEAN_NAME ));
215
218
}
216
219
}
217
220
218
221
/**
219
- * Registers an {@link FixedThemeResolver } under a well-known name
222
+ * Registers an {@link AcceptHeaderLocaleResolver } under a well-known name
220
223
* unless already registered.
221
224
*/
222
- private static void registerThemeResolver (ParserContext parserContext , @ Nullable Object source ) {
223
- if (!parserContext . getRegistry (). containsBeanDefinition ( DispatcherServlet .THEME_RESOLVER_BEAN_NAME )) {
224
- RootBeanDefinition beanDef = new RootBeanDefinition (FixedThemeResolver .class );
225
+ private static void registerLocaleResolver (ParserContext context , @ Nullable Object source ) {
226
+ if (!containsBeanInHierarchy ( context , DispatcherServlet .LOCALE_RESOLVER_BEAN_NAME )) {
227
+ RootBeanDefinition beanDef = new RootBeanDefinition (AcceptHeaderLocaleResolver .class );
225
228
beanDef .setSource (source );
226
229
beanDef .setRole (BeanDefinition .ROLE_INFRASTRUCTURE );
227
- parserContext .getRegistry ().registerBeanDefinition (DispatcherServlet .THEME_RESOLVER_BEAN_NAME , beanDef );
228
- parserContext .registerComponent (new BeanComponentDefinition (beanDef , DispatcherServlet .THEME_RESOLVER_BEAN_NAME ));
230
+ context .getRegistry ().registerBeanDefinition (DispatcherServlet .LOCALE_RESOLVER_BEAN_NAME , beanDef );
231
+ context .registerComponent (new BeanComponentDefinition (beanDef , DispatcherServlet .LOCALE_RESOLVER_BEAN_NAME ));
229
232
}
230
233
}
231
234
232
235
/**
233
- * Registers an {@link AcceptHeaderLocaleResolver } under a well-known name
236
+ * Registers an {@link FixedThemeResolver } under a well-known name
234
237
* unless already registered.
235
238
*/
236
- private static void registerLocaleResolver (ParserContext parserContext , @ Nullable Object source ) {
237
- if (!parserContext . getRegistry (). containsBeanDefinition ( DispatcherServlet .LOCALE_RESOLVER_BEAN_NAME )) {
238
- RootBeanDefinition beanDef = new RootBeanDefinition (AcceptHeaderLocaleResolver .class );
239
+ private static void registerThemeResolver (ParserContext context , @ Nullable Object source ) {
240
+ if (!containsBeanInHierarchy ( context , DispatcherServlet .THEME_RESOLVER_BEAN_NAME )) {
241
+ RootBeanDefinition beanDef = new RootBeanDefinition (FixedThemeResolver .class );
239
242
beanDef .setSource (source );
240
243
beanDef .setRole (BeanDefinition .ROLE_INFRASTRUCTURE );
241
- parserContext .getRegistry ().registerBeanDefinition (DispatcherServlet .LOCALE_RESOLVER_BEAN_NAME , beanDef );
242
- parserContext .registerComponent (new BeanComponentDefinition (beanDef , DispatcherServlet .LOCALE_RESOLVER_BEAN_NAME ));
244
+ context .getRegistry ().registerBeanDefinition (DispatcherServlet .THEME_RESOLVER_BEAN_NAME , beanDef );
245
+ context .registerComponent (new BeanComponentDefinition (beanDef , DispatcherServlet .THEME_RESOLVER_BEAN_NAME ));
243
246
}
244
247
}
245
248
246
249
/**
247
- * Registers an {@link SessionFlashMapManager } under a well-known name
250
+ * Registers an {@link DefaultRequestToViewNameTranslator } under a well-known name
248
251
* unless already registered.
249
252
*/
250
- private static void registerFlashMapManager (ParserContext parserContext , @ Nullable Object source ) {
251
- if (!parserContext . getRegistry (). containsBeanDefinition ( DispatcherServlet .FLASH_MAP_MANAGER_BEAN_NAME )) {
252
- RootBeanDefinition beanDef = new RootBeanDefinition (SessionFlashMapManager .class );
253
+ private static void registerViewNameTranslator (ParserContext context , @ Nullable Object source ) {
254
+ if (!containsBeanInHierarchy ( context , DispatcherServlet .REQUEST_TO_VIEW_NAME_TRANSLATOR_BEAN_NAME )) {
255
+ RootBeanDefinition beanDef = new RootBeanDefinition (DefaultRequestToViewNameTranslator .class );
253
256
beanDef .setSource (source );
254
257
beanDef .setRole (BeanDefinition .ROLE_INFRASTRUCTURE );
255
- parserContext .getRegistry ().registerBeanDefinition (DispatcherServlet .FLASH_MAP_MANAGER_BEAN_NAME , beanDef );
256
- parserContext .registerComponent (new BeanComponentDefinition (beanDef , DispatcherServlet .FLASH_MAP_MANAGER_BEAN_NAME ));
258
+ context .getRegistry ().registerBeanDefinition (
259
+ DispatcherServlet .REQUEST_TO_VIEW_NAME_TRANSLATOR_BEAN_NAME , beanDef );
260
+ context .registerComponent (
261
+ new BeanComponentDefinition (beanDef , DispatcherServlet .REQUEST_TO_VIEW_NAME_TRANSLATOR_BEAN_NAME ));
257
262
}
258
263
}
259
264
260
265
/**
261
- * Registers an {@link DefaultRequestToViewNameTranslator } under a well-known name
266
+ * Registers an {@link SessionFlashMapManager } under a well-known name
262
267
* unless already registered.
263
268
*/
264
- private static void registerViewNameTranslator (ParserContext parserContext , @ Nullable Object source ) {
265
- if (!parserContext . getRegistry (). containsBeanDefinition ( DispatcherServlet .REQUEST_TO_VIEW_NAME_TRANSLATOR_BEAN_NAME )) {
266
- RootBeanDefinition beanDef = new RootBeanDefinition (DefaultRequestToViewNameTranslator .class );
269
+ private static void registerFlashMapManager (ParserContext context , @ Nullable Object source ) {
270
+ if (!containsBeanInHierarchy ( context , DispatcherServlet .FLASH_MAP_MANAGER_BEAN_NAME )) {
271
+ RootBeanDefinition beanDef = new RootBeanDefinition (SessionFlashMapManager .class );
267
272
beanDef .setSource (source );
268
273
beanDef .setRole (BeanDefinition .ROLE_INFRASTRUCTURE );
269
- parserContext .getRegistry ().registerBeanDefinition (DispatcherServlet .REQUEST_TO_VIEW_NAME_TRANSLATOR_BEAN_NAME , beanDef );
270
- parserContext .registerComponent (new BeanComponentDefinition (beanDef , DispatcherServlet .REQUEST_TO_VIEW_NAME_TRANSLATOR_BEAN_NAME ));
274
+ context .getRegistry ().registerBeanDefinition (DispatcherServlet .FLASH_MAP_MANAGER_BEAN_NAME , beanDef );
275
+ context .registerComponent (new BeanComponentDefinition (beanDef , DispatcherServlet .FLASH_MAP_MANAGER_BEAN_NAME ));
271
276
}
272
277
}
273
278
@@ -290,4 +295,16 @@ public static Object getContentNegotiationManager(ParserContext context) {
290
295
return null ;
291
296
}
292
297
298
+ /**
299
+ * Check for an existing bean of the given name, ideally in the entire
300
+ * context hierarchy (through a {@code containsBean} call) since this
301
+ * is also what {@code DispatcherServlet} does, or otherwise just in
302
+ * the local context (through {@code containsBeanDefinition}).
303
+ */
304
+ private static boolean containsBeanInHierarchy (ParserContext context , String beanName ) {
305
+ BeanDefinitionRegistry registry = context .getRegistry ();
306
+ return (registry instanceof BeanFactory ? ((BeanFactory ) registry ).containsBean (beanName ) :
307
+ registry .containsBeanDefinition (beanName ));
308
+ }
309
+
293
310
}
0 commit comments