public interface BeanFactoryPostProcessor {
/**
* Modify the application context's internal bean factory after its standard
* initialization. All bean definitions will have been loaded, but no beans
* will have been instantiated yet. This allows for overriding or adding
* properties even to eager-initializing beans.
* @param beanFactory the bean factory used by the application context
* @throws org.springframework.beans.BeansException in case of errors
*/
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
}
上面的英文大家能看懂吧。allows for overriding or adding properties even to eager-initializing beans.
//声明将被后处理的BeanFactory实例
ConfigurableListableBeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("..."));
//声明要使用的BeanFactoryPostProcessor
PropertyPlaceholderConfigurer propertyPostProcessor = new PropertyPlaceholderConfigurer();
propertyPostProcessor.setLocation(new ClassPathResource("..."));
//执行后处理操作
propertyPostProcessor.postProcessBeanFactory(beanFactory);
使用Application
...
conf/myjdbc.properties
conf/mail.properties
...
使用了propertyPlaceHolderConfigure后,xml中dataSource如下
${jdbc.url}
${jdbc.driver}
${jdbc.username}
${jdbc.password}
true
true
...
##myjdbc.properties
jdbc.url=jdbc:mysql://server/MAIN?useUnicode=true&characterEncoding=ms932&failOverReadOnly=false&roundRobinLoadBalance=true
jdbc.driver=com.mysql.jdbc.Driver
jdbc.username=your username
jdbc.password=your password
xml中的${jdbc.url},就用properties中的jdbc.url相对应。
没有什么好讲的,就是这些死内容而已。##文件名是adjusment.properties
dataSource.minEvictableIdleTimeMillis=1000
dataSource.maxActive=50
注意这个dataSource指的是beanName。***
< /bean>
PropertyOverrideConfigurer使用BeanFactory的方式,我就不再赘述了。
注意
按照JavaBeans的规范,JavaBeans的基础设施会在JavaBean相同类包下查找是否存在
XmlBeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource
CustomEditorConfigurer ceConfigurer = new CustomEditorConfigurer();
Map customerEditors = new HashMap();
customerEditors.put(java.util.Date.class, new DatePropertyEditor()); //以后凡是string转Date型的 都用DatePropertyEditor
ceConfigurer.setCustomEditors(customerEditors);
ceConfigurer.postProcessBeanFactory(beanFactory);
DatePropertyEditor如下
如果我们想把某种格式的字符串转化为Person类,那么我们可以采用上面的方式,但是如果我们想把spring转化成date,我们又不能新建一个package名字叫java.util。
所以我们得让容器知道CustomEditorConfigurer的实现。
使用硬编码的方式,上面已经说了
如果是采用ApplicationContext,xml如下:
使用时:
大家注意,我给DateFoo传递的事一个"符合"DatePropertyEdit中datePattern格式的字符串"2007/10/16",这个字符串就是DatePropertyEdit中setAsTest方法中的参数
通过CustomerEditorConifgure,Spring已经知道了凡是String要转化成Date都去找datePropertyEdit... 后面的大家应该都能看懂了
不过在spring2.0之后,提倡使用,比较提倡使用propertyEditorRegistrars属性来指定自定义的PropertyEditor。这样一来我们就多了一步,实现PropertyEditorRegistrar 接口
然后在xml里这样注册:
再次注意:
我们知道有了上面的配置后,string转成date就会用datePrpertyEditor这个类
但是,这个类是什么时候被调用的呢?
答案是: 在getBean的时候
感谢glt