Let's say we want to use a property inside a spring bean like the following:
<bean id="myBean" class="com.mypackage.MyClass"> <property name="myProperty"> <value>${propertyValue}</value> </property> </bean>
If propertyValue is defined inside a properties file we should define a propertyConfigurer bean:
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location"> <value>classpath:myfile.properties</value> </property> </bean>
If we want propertyValue to be overridden by system properties we can specify systemPropertiesModeName :
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location"> <value>classpath:myfile.properties</value> </property> <property name="systemPropertiesModeName"> <value>SYSTEM_PROPERTIES_MODE_OVERRIDE</value> </property> </bean>
If our settings are defined inside a storage system (database, content repository), spring 3 will help us a lot with its new expression language SpEL. This allows for calling methods from a defined spring bean.
Lets say we have a settings bean like the following, were storageService can be any storage you need:
<bean id="settings" class="com.mypackage.SettingsBean"> <property name="storageService" ref="storageService"></property> </bean>
SettingBean will offer us the propertyValue we need :
public class SettingsBean { private StorageService storageService; public Settings getSettings() { return storageService.getSettings(); } @Required public void setStorageService(StorageService storageService) { this.storageService = storageService; } // helper methods used in Spring with SpEL public String getPropertyValue() { Settings settings = getSettings(); return settings.getPropertyValue(); } }
With SpEL we can use the propertyValue in our bean like this:
<bean id="myBean" class="com.mypackage.MyClass"> <property name="myProperty" value="#{settings.getPropertyValue()}"/> </bean>
If the bean, which needs some settings from a storage, is a bean from the spring api, then it's very easy to set the properties using SpEL . Otherwise we would have had to extend that class to inject our storage. For example a Spring ThreadPoolTaskExecutor can be defined like this :
<bean id="schedulingTaskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <property name="threadNamePrefix" value="Scheduler-"/> <property name="corePoolSize" value="#{settings.getSchedulerCorePoolSize()}"/> <property name="maxPoolSize" value="#{settings.getSchedulerMaxPoolSize()}"/> <property name="queueCapacity" value="#{settings.getSchedulerQueueCapacity()}"/> </bean>
No comments:
Post a Comment