当我想把配置文件include的功能加进步的时候,我打开了spring的参考手册,想大概看看spring是怎么做的。
但是我看到了spring中PropertyPlaceholderConfigurer的做法,对比了一下我的做法,发现我的很土啊,于是打算重写这个功能。
spring是用BeanFacoryPostProcessor来做的,就是在所有bean生成之前,要调一个回调方法。
问题是,这里实现了BeanFacoryPostProcessor接口的bean需要配置在配置文件中,像其他bean一样被创建,这样就遇到一个像
鸡先还是蛋先的问题。既然在所有bean生成之前,就要有这个BeanFacoryPostProcessor,但是BeanFacoryPostProcessor又是
一个bean。。。。。。。。。。
所以,我打算把BeanFacoryPostProcessor特殊化,也就是要从众多bean中找出BeanFacoryPostProcessor的定义。
本来我看了看spring的代码,以为要把BeanFacoryPostProcessor实例化才可以知道它是不是实现了这个接口,但是后来我发现
并不是这样的,只要有BeanFacoryPostProcessor的class就可以了。但是我的设计是读配置的时候只把String类型的className
保存,而没有保存class,看了看spring也是保存class的,看来我的设计有错误了,于是马上进行修改。
嗯,终于改好了。就是这个函数,在refresh()中加入
private void handleModuleFactoryPostProcessor() throws ModulesException, FactortInitialException, ConstructorException {
List<String> names=getPostProcessorNames(ModuleFactoryPostProcessor.class);
for(String name:names){
ModuleFactoryPostProcessor mfpp=(ModuleFactoryPostProcessor) getModule(name);
singletons.put(name, mfpp);
mfpp.postProcessModuleFactory(this);
for(ConfigurableApplicationContext context:kids){
mfpp.postProcessModuleFactory(context);
}
}
}
我原来实现PropertyPlaceholderConfigurer这个功能,写得很烂,哈哈,现在爽多了。
但是我看到了spring中PropertyPlaceholderConfigurer的做法,对比了一下我的做法,发现我的很土啊,于是打算重写这个功能。
spring是用BeanFacoryPostProcessor来做的,就是在所有bean生成之前,要调一个回调方法。
问题是,这里实现了BeanFacoryPostProcessor接口的bean需要配置在配置文件中,像其他bean一样被创建,这样就遇到一个像
鸡先还是蛋先的问题。既然在所有bean生成之前,就要有这个BeanFacoryPostProcessor,但是BeanFacoryPostProcessor又是
一个bean。。。。。。。。。。
所以,我打算把BeanFacoryPostProcessor特殊化,也就是要从众多bean中找出BeanFacoryPostProcessor的定义。
本来我看了看spring的代码,以为要把BeanFacoryPostProcessor实例化才可以知道它是不是实现了这个接口,但是后来我发现
并不是这样的,只要有BeanFacoryPostProcessor的class就可以了。但是我的设计是读配置的时候只把String类型的className
保存,而没有保存class,看了看spring也是保存class的,看来我的设计有错误了,于是马上进行修改。
嗯,终于改好了。就是这个函数,在refresh()中加入
private void handleModuleFactoryPostProcessor() throws ModulesException, FactortInitialException, ConstructorException {
List<String> names=getPostProcessorNames(ModuleFactoryPostProcessor.class);
for(String name:names){
ModuleFactoryPostProcessor mfpp=(ModuleFactoryPostProcessor) getModule(name);
singletons.put(name, mfpp);
mfpp.postProcessModuleFactory(this);
for(ConfigurableApplicationContext context:kids){
mfpp.postProcessModuleFactory(context);
}
}
}
我原来实现PropertyPlaceholderConfigurer这个功能,写得很烂,哈哈,现在爽多了。