首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

不反复配置——利用Spring通用化配置

2012-11-08 
不重复配置——利用Spring通用化配置还记得 如下这种配置吗:?1、struts2作用域:每一个Action我们必须设置scop

不重复配置——利用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没必要用这个。

热点排行