views:

532

answers:

1

What I would like to achieve is the ability to "dynamically" (i.e. based on a property defined in a configuration file) enable/disable the importing of a child Spring XML context.

I imagine something like:

<import condition="some.property.name" resource="some-context.xml"/>

Where the property is resolved (to a boolean) and when true the context is imported, otherwise it isn't.

Some of my research so far:

  • Writing a custom NamespaceHandler (and related classes) so I can register my own custom element in my own namespace. For example: <myns:import condition="some.property.name" resource="some-context.xml"/>

    The problem with this approach is that I do not want to replicate the entire resource importing logic from Spring and it isn't obvious to me what I need to delegate to to do this.

  • Overriding DefaultBeanDefinitionDocumentReader to extend the behaviour of the "import" element parsing and interpretation (which happens there in the importBeanDefinitionResource method). However I'm not sure where I can register this extension.
+1  A: 

The closest you can get using standard Spring components is:

<import resource="Whatever-${yyzzy}.xml"/>

where ${xyzzy} interpolates a property from the system properties. (I use a hacky custom version of the context loader class that adds properties from other places before starting the loading process.)

But you can also get away with importing lots of unnecessary stuff ... and use various tricks to only cause the necessary beans to be instantiated. These tricks include:

  • placeholder and property substitution
  • selecting different beans using the new Spring expression language,
  • bean aliases with placeholders in the target name,
  • lazy bean initialization, and
  • smart bean factories.
Stephen C
I don't want to actually touch the context of the module in question and prevent bean instantiation in that manner. I'd really like to keep the context boundary for the module and toggle on that level.I had considered the property replacer for the resource URI but as you said only system properties are considered and it only allows me to switch to a different context, not to disable one.Perhaps I would have to provide a generic, empty "disabled-module-context.xml"?
Boris Terzic
@Boris - that's what I do. Take a look at the "metadata-net" project on SourceForge, and see how the Danno / Emmet / Chico configurations work. It is still something of a work in progress, but you could probably borrow some ideas.
Stephen C