不重复配置——利用Spring通用化配置
还记得 如下这种配置吗:
?
1、struts2作用域:每一个Action我们必须设置scope为prototype ? 每次都做重复的配置,而且有时候忘记配置还会出现bug,想不想删掉它?
?
<bean id="**Action" scope="prototype">
?
2、在使用spring集成hibernate时,每次都必须注入sessionFactory,虽然可以用父子bean解决 但还是要写parent="abstractHibernateDao"之类的。
<bean id="***Dao" ref="sessionFactory">
</bean>
?
受够了这种配置,得想法解决这个重复配置,怎么解决呢?
?
补充:
首先感谢downpour大哥的批评:
?
?
?
<context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath:spring-common-config.xml, classpath:spring-budget-config.xml </param-value> </context-param>
2、struts2 Action scope问题
?如果使用StrutsPrepareAndExecuteFilter可以通过:
?
?
<init-param><param-name>actionPackages</param-name><param-value>Action所在包前缀</param-value></init-param>
?scope会自动是prototype
?
?使用我说的这种设置方式:我觉得因为只要会Struts2+Spring集成都知道struts2的Action是prototype,可以用;『prototype属性不能也不该省略,配置是给人看的,要是人看不懂就是垃圾。』这个是这么回事,需要仔细考虑下;当然我可以考虑在配置文件中加上注释 说明一下 告诉其他人是怎么回事。
?
?另外这个功能我想可以改建为检查配置是否正确 类似于spring的依赖检查。欢迎大家拍砖。
?
思路:
在BeanFactory创建Bean之前查找所有我们需要通用化配置的Bean 然后修改BeanDefinition注入我们的通用数据就可以解决我们这个问题。
?
Spring提供了BeanFactoryPostProcessor扩展点,用于提供给我们修改BeanDefinition数据的。
?
还记得org.springframework.beans.factory.config.PropertyPlaceholderConfigurer吗? 替换占位符数据,它就是一个BeanFactoryPostProcessor的实现。
?
好了思路有了,接下来我们实现一下吧:
1、XML配置方式
?
?*?
?* 使用方法:<br/>
?* <pre>
?* ?<bean name="code">package cn.javass.common.spring;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Map.Entry;import java.util.Properties;import org.aspectj.bridge.IMessageHandler;import org.aspectj.weaver.ResolvedType;import org.aspectj.weaver.World;import org.aspectj.weaver.bcel.BcelWorld;import org.aspectj.weaver.patterns.Bindings;import org.aspectj.weaver.patterns.FormalBinding;import org.aspectj.weaver.patterns.IScope;import org.aspectj.weaver.patterns.PatternParser;import org.aspectj.weaver.patterns.SimpleScope;import org.aspectj.weaver.patterns.TypePattern;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.BeansException;import org.springframework.beans.factory.config.BeanDefinition;import org.springframework.beans.factory.config.BeanFactoryPostProcessor;import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;import org.springframework.beans.factory.config.RuntimeBeanNameReference;import org.springframework.beans.factory.config.RuntimeBeanReference;import org.springframework.util.StringUtils;/** * * 设置通用配置<br/> * * 使用方法:<br/> * <pre> * <bean /> ) 现在网站的pr也有了 就不用了。
Autowired我认为它的范围太大 对于所有setter都要查找并注入,所以很难排查错误原因,只有在运行期运行到那才会知道。 这是我的体会。
我写这个文章也是想表达一种我的一些思考,为什么每次我都要配置这个东西?而且还是重复的?为什么就不能不配?从这点可以看出sessionFactory没必要用这个。