专注于Jsp开发,为Jsp开发提供源动力 VM主机| 海外空间| 郑州网站建设| 郑州网络公司| 洛阳网站建设
jsp空间

一种基于Spring的java程序常量管理思路

添加时间:[2010-3-18 8:44:46] 

 在编写程序的时候,总是不可避免的需要使用一些常量,甚至很多的常量。我们可以对常量进行一个很简单的分类:

    记忆性常量:主要出于程序结构上的考虑而设定的常量。譬如为了避免一个没有字面意思的魔法数,或者避免拼写容易出错,或者不容记住的内容。

    业务性常量:表示一个业务上的一个特定业务实体的属性或属性值。

    很多的时候,一个业务性常量很多时候也是一个记忆性常量。

    在一个大型项目中,参与的人员和代码数量通常都会比较多,没有好的管理策略,常量的使用往往想入混乱中。譬如重复定义,其维护的值甚至还不一致,以外覆盖;譬如仅仅为了使用某个常量,而引入某个包或者类,由此可能引出模块间的循环依赖等。

    良好的设计结构,以及严格的开发纪律基本上可以解决上述问题。除了有时的确是不可避免的出现以上问题外,有时一些所谓的业务常量只有在部署期间或同别的系统集成是才能获得。所以有必要进一步的探讨常量的管理手段。

    记得在JavaEye上看到一篇关于Spring属性注入的文章,灵机一动,不是恰好可以用来处理这个问题吗?所谓属性注入,意思是指将配置信息写在Properties文件中,通过IOC容器透明的注入。

    这么设想下,如果常量最终都可以用配置文件配置,那么就可以解决“业务常量只有在部署期间或同别的系统集成是才能获得”的问题,如果同时还可以透明的宣称使用常量,那么几乎所有的问题就完美了:

    不害怕重复定义错误

    消除有常量引用引起的循环引用

    提供从部署期覆盖编译期的灵活性

    使用Spring的扩展名称空间和Java5的Annotation语法,我们可以整理出以以下思路

    定义一个Annotation类

    实现一个Annotation的Processor

    配置Processor Bean

    实现过程大致如下:

    一、Annotation

    @Target({ElementType.FIELD,ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Properties {
        String name() default "";
        String value() default "";
        String namePrefix() default "";
        String namePostfix() default "";
    }

    二、Processor

    public class AnnotationPropertiesBeanPostProcessor extends PropertyPlaceholderConfigurer implements BeanPostProcessor, InitializingBean {

        private java.util.Properties pros;
        private String namePrefix = "";
        private String namePostfix = "";

        public void setEnabledClassList(Class[] enabledClassList) {
            this.enabledClassList = enabledClassList;
        }

        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            return bean;
        }

        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            HandlePropertiesAnnotatedBean(bean, bean.getClass());
            return bean;
        }

        private void HandlePropertiesAnnotatedBean(Object bean, Class asClass) throws SecurityException {
            if( isHandleInheritance(asClass.getSuperclass()) ){
                HandlePropertiesAnnotatedBean(bean, asClass.getSuperclass());
            }
            Field[] fields = asClass.getDeclaredFields();
            for (Field field : fields) {
                if (support(field.getType())) {
                    handleField(bean, field, defaultIsRequired(bean, asClass));
                }
            }
        }
        private void handleField(Object bean, Field field, boolean defaultIsRequired) {
            if (isProhibited(field)) {
                return;
            }
            if (defaultIsRequired || isRequired(field)) {
                try {
                    ReflectionUtils.makeAccessible(field);
                    field.set(bean, getPropertyValue(field));
                } catch (Exception ex) {
                    Logger.getLogger(AnnotationPropertiesBeanPostProcessor.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
       ......

    三、配置 bean

    Xml代码

    <bean class="com.joyplus.ext.spring.AnnotationPropertiesBeanPostProcessor" />

    四、使用实例

    @Properties(namePrefix="ddd")
    public class Config {
        @Properties(name="author")
        private String author;

        private String tvalue;

        @Properties(value="default name",namePrefix="ooo")
        private String tname;

        private String nonValue;

      // getter and setter
    }

    五、示例Properties文件内容

    Xml代码

    dddauthor=用的是 class 级别的 prefix
    oootname=用的是 field 级别的 prefix
    dddnonValue=用sd

关于我们 | 付款方式 | 客户管理 | 网站导航 | 友情连接


版权所有 2008 三易网络(洛阳)科技开发有限公司 京ICP备06012028号

服务热线:0371-63653120 63658758(郑州) 0379-63921200   63265368(洛阳)

QQ在线客服: JSP空间咨询   JSP空间咨询    Email:web@suneasy.cn

郑州网络公司 郑州网站建设 洛阳网站建设

总部地址:纱厂南路41号中泰新城泰福苑803室 郑州分公司地址:金水区圣菲城