`
karlhell
  • 浏览: 106584 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

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




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

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



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

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

记得在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
<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文件内容
dddauthor=用的是 class 级别的 prefix

oootname=用的是 field 级别的 prefix

dddnonValue=用sd
分享到:
评论
1 楼 javne 2010-08-04  
StringUtils.select(p.namePrefix(), "".equals(p.namePrefix()), prefix)

也能发下源代码么。。或者说下原理

相关推荐

    Java程序设计及应用开发教程

    首先,我们从基础开始,Java是一种面向对象的编程语言,由Sun Microsystems(现为Oracle Corporation)于1995年推出。它的设计目标是具有简单性、面向对象、健壮性、安全性、平台独立性和可移植性等特点。Java的核心...

    《Java程序设计》讲义(武汉大学)

    5. 接口:接口是一种完全抽象的类,只包含常量和抽象方法,用于定义类的行为规范。 四、异常处理 Java提供了一套完整的异常处理机制,通过try-catch-finally语句块来捕获和处理程序运行时可能出现的错误,保证程序...

    java程序设计课件

    5. **DAO(Data Access Object)模式**:这是一种常用的数据库访问设计模式,将业务逻辑与数据访问逻辑分离,提供更清晰的代码结构。 6. **ORM(Object-Relational Mapping)框架**:如Hibernate、MyBatis等,它们...

    java程序设计作者(顾雍海)

    2. **面向对象**:Java是一种面向对象的语言,封装、继承、多态是其三大特性。书中会介绍如何创建类,定义方法,以及理解类与对象的关系。 3. **异常处理**:Java的异常处理机制能帮助开发者优雅地处理程序运行时...

    74个java面试题,只有题目没有答案

    JDBC(Java Database Connectivity)是一种基于 SQL 的数据库连接机制。 59. Java Hibernate * 什么是 Hibernate?Hibernate 是一个基于 ORM(Object-Relational Mapping)的持久化框架。 60. Java 分布式架构 *...

    一种基于逻辑的Java模块依赖图构建工具.zip

    总之,基于逻辑的Java模块依赖图构建工具是一种强大的辅助开发工具,它能够帮助我们管理和优化项目结构,提升代码质量,从而促进项目的可持续发展。通过深入理解并熟练运用这类工具,开发者可以更好地应对复杂项目...

    《Java面向对象程序设计(第2版)》课件

    - 接口(Interface):接口是一种完全抽象的类,仅包含常量和抽象方法。它用于实现多重继承,使得类可以同时实现多个接口。 - 内部类(Inner Class):Java支持嵌套类,包括静态和非静态内部类,可以增强代码的...

    JAVA相关面试题,Spring面试题

    - **Spring**: Spring框架是一个轻量级的Java应用开发框架,提供了一系列企业级服务,如依赖注入(DI)、面向切面编程(AOP)、事务管理等。 #### 十五、Spring框架的主要优点? - **IoC(Inversion of Control)*...

    Java程序设计(徐红)教学资源_云海大数据

    Java是一种广泛使用的面向对象的编程语言,它以其“一次编写,到处运行”的特性闻名于世。本教学资源可能包含了关于Java语言的基础知识、核心概念以及高级特性,旨在帮助学习者掌握Java编程技能,适应大数据时代的...

    JAVA程序设计课件

    1. **Java简介**:Java是一种跨平台、面向对象的编程语言,由Sun Microsystems(现为Oracle Corporation的一部分)于1995年发布。它的设计目标是“写一次,到处运行”,通过Java虚拟机(JVM)实现平台无关性。 2. *...

    java经典程序100例

    9. **枚举**:Java中的枚举类型提供了一种安全的方式来表示一组固定值,比传统的int常量更易读、易维护。 10. **注解**:注解是元数据的一种形式,可以提供编译时或运行时的额外信息。例如,Spring框架中的@Service...

    JAVA程序设计(SWF版)基础

    1. **Java简介**:Java是一种跨平台、面向对象的编程语言,由Sun Microsystems(现为Oracle公司)于1995年推出。它的“一次编写,到处运行”(Write Once, Run Anywhere, WORA)特性使其在不同操作系统上具有高度可...

    springdata整合sprig+springmvc+maven分模块化搭建项目

    Spring Data的主要目标是简化数据访问的实现,提供了一种统一的API来操作不同的数据存储,如JPA、MongoDB、Redis等。它通过自动的Repository接口实现,减少了大量手动编写的DAO层代码。在Spring Data中,你可以定义...

    JAVA程序设计与问题

    1. **语法基础**:Java是一种面向对象的编程语言,其语法结构严谨。理解基本的数据类型(如int、double等)、变量声明、控制流语句(如if-else、switch-case、for循环、while循环)对于初学者来说至关重要。 2. **...

    JAVA程序设计教程(电子教案+源码)

    首先,Java是一种面向对象的编程语言,由Sun Microsystems(现属Oracle公司)在1995年推出,其设计目标是具有跨平台性、安全性以及可移植性。Java的核心理念是“一次编写,到处运行”,这意味着编写好的Java代码可以...

    -经典java小程序源代码合集

    在IT行业中,Java是一种广泛应用的编程语言,尤其在企业级应用、Web开发和移动应用领域。这个"经典java小程序源代码合集"提供了一个宝贵的资源库,包含了164个精心设计的Java程序,这对于学习者和开发者来说是极其...

    自已实现spring ioc功能代码 jdk1.6的一些新特性

    - **枚举类型**:提供了一种创建常量集的方式,可以替代传统的final static变量,使代码更清晰、更安全。 - **可变参数**:允许方法接受可变数量的参数,方便地创建灵活的函数接口。 - **静态导入**:可以避免...

    快易通Java程序设计

    18. **Spring框架**:如果“快易通Java程序设计”涵盖了进阶内容,那么Spring框架可能会被介绍,它是企业级Java应用的基石,涉及依赖注入、AOP(面向切面编程)和Spring Boot等。 以上只是Java编程的一部分关键知识...

Global site tag (gtag.js) - Google Analytics