खैर तुम क्या कर सकता है फिर से परिभाषित अभिव्यक्ति भाषा सीमांकक।
मैं कहूंगा कि जिस तरह से यह करने के लिए एक विशेष सेम कि (जिम हुआंग द्वारा प्रेरणा के लिए धन्यवाद) BeanFactoryPostProcessor
लागू करता है के माध्यम से है:
<bean class="foo.bar.ExpressionTokensRedefiner">
<property name="expressionPrefix" value="[[" />
<property name="expressionSuffix" value="]]" />
</bean>
:
public class ExpressionTokensRedefiner implements BeanFactoryPostProcessor{
private BeanExpressionResolver beanExpressionResolver;
public void setBeanExpressionResolver(
final BeanExpressionResolver beanExpressionResolver){
this.beanExpressionResolver = beanExpressionResolver;
}
@Override
public void postProcessBeanFactory(
final ConfigurableListableBeanFactory beanFactory)
throws BeansException{
beanFactory.setBeanExpressionResolver(createResolver());
}
private String expressionPrefix = "${";
private String expressionSuffix = "}";
public void setExpressionPrefix(final String expressionPrefix){
this.expressionPrefix = expressionPrefix;
}
public void setExpressionSuffix(final String expressionSuffix){
this.expressionSuffix = expressionSuffix;
}
private BeanExpressionResolver createResolver(){
if(beanExpressionResolver == null){
final StandardBeanExpressionResolver resolver =
new StandardBeanExpressionResolver();
resolver.setExpressionPrefix(expressionPrefix);
resolver.setExpressionSuffix(expressionSuffix);
return resolver;
} else{
return beanExpressionResolver;
}
}
}
इस तरह एक सेम के रूप में यह परिभाषित करें
या इस तरह:
<!-- this will use the default tokens ${ and } -->
<bean class="foo.bar.ExpressionTokensRedefiner" />
या एक कस्टम समाधानकर्ता का उपयोग करें:
<bean class="foo.bar.ExpressionTokensRedefiner">
<property name="beanExpressionResolver">
<bean class="foo.bar.CustomExpressionResolver" />
</property>
</bean>
अब आप अपनी परिभाषाओं को बिना छूटे छोड़ सकते हैं और यदि आप स्पेल का उपयोग करना चाहते हैं, तो नए डिलीमीटर का उपयोग करें।
संपादित करें: अब मैंने इसका परीक्षण किया और यह वास्तव में काम करता है।
<bean class="foo.bar.ExpressionTokensRedefiner">
<property name="expressionPrefix" value="[[" />
<property name="expressionSuffix" value="]]" />
</bean>
<bean class="foo.bar.FooFritz">
<property name="fizz" value="[[ systemProperties['user.home'] ]]"></property>
<property name="fozz" value="[[ systemProperties['java.io.tmpdir'] ]]"></property>
<!-- this is what it would normally choke on -->
<property name="fazz" value="#{ boom() }"></property>
</bean>
टेस्ट कोड:
final ConfigurableApplicationContext context =
new ClassPathXmlApplicationContext("classpath:foo/bar/ctx.xml");
context.refresh();
final FooFritz fooFritz = context.getBean(FooFritz.class);
System.out.println(fooFritz.getFizz());
System.out.println(fooFritz.getFozz());
System.out.println(fooFritz.getFazz());
आउटपुट:
/घर/seanizer
/tmp
# {बूम()}
स्रोत
2010-12-16 18:10:14
'बीनफैक्टरीपोस्टप्रोसेसर 'निश्चित रूप से उपयोग करने के लिए बेहतर चीज है (+1)। मैं तदनुसार अपना जवाब बदल दूंगा –