java简单框架设计

     设计框架包可以作为一个工具给大家用,需要有完全不同设计思路给出来,不同于我们去做一个web服务、网站、

或者一个业务微服务,需要从原来使用视角转换成一个构建者视角。

     框架或者工具,更多是框架来管理或者说调用我们,我们来遵循框架原则来实现,框架和业务实现上的核心差异。

     java框架,可以依赖注解以及抽象类来实现逻辑,实现基于注解配置,通过注解简化配置方式。子类实现抽象类,

子类中的注解对象可以用过反射方式在框架中被调用,从而实现一个简单的框架。  

注解类:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

//注解配置信息字段.
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface DeskConf {

    String getComponent() default "";

    String value();
}
抽象类:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

//注解配置信息字段.
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface DeskConf {

    String getComponent() default "";

    String value();
}
解析工具:
import org.apache.log4j.Logger;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

/**
 * 读取注解信息
 */
public class ConfigAnnotationParse {
    protected Logger logger = Logger.getLogger(ConfigAnnotationParse.class);
    private ConfRegister configRegister;

    public ConfigAnnotationParse(ConfRegister configCenter) {
        this.configRegister = configCenter;
    }



    public DeskConf parseNodeAnnotation() throws Exception {
        if (configRegister == null)
            throw new ExceptionInInitializerError("ConfigRegister 统一配置注册中心必须被继承实现");
        Class clazz = configRegister.getClass();
        Map<String,String> nodeMap = new HashMap<String,String>();
        DeskConf deskConf = null;
        Field[] fields = clazz.getDeclaredFields();
        for(Field field : fields) {
            if (field.isAnnotationPresent(DeskConf.class)) {
                deskConf = field.getAnnotation(DeskConf.class);
            }
        }
        return deskConf;
    }

}

使用样例:
import org.apache.log4j.Logger;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

/**
 * 读取注解信息
 */
public class ConfigAnnotationParse {
    protected Logger logger = Logger.getLogger(ConfigAnnotationParse.class);
    private ConfRegister configRegister;

    public ConfigAnnotationParse(ConfRegister configCenter) {
        this.configRegister = configCenter;
    }



    public DeskConf parseNodeAnnotation() throws Exception {
        if (configRegister == null)
            throw new ExceptionInInitializerError("ConfigRegister 统一配置注册中心必须被继承实现");
        Class clazz = configRegister.getClass();
        Map<String,String> nodeMap = new HashMap<String,String>();
        DeskConf deskConf = null;
        Field[] fields = clazz.getDeclaredFields();
        for(Field field : fields) {
            if (field.isAnnotationPresent(DeskConf.class)) {
                deskConf = field.getAnnotation(DeskConf.class);
            }
        }
        return deskConf;
    }

}

接口:
public interface ConfService {

    /**
     * 获取配置信息
     * @param name 项目名称.
     * @param key key名称.
     * @return
     */
    String getConf(String name,String key);

    /**
     * 获得所属模块.
     * @return
     */
    String  getComponent();
}
实现类:
public class ConfServiceImpl implements ConfService {
    private ConfRegister myConfRegister;
    private DeskConf deskConf;

    /**
     *
     * @param confRegister
     * @throws Exception
     */
    public ConfServiceImpl(ConfRegister confRegister) throws Exception {
        this.myConfRegister = confRegister;
        ConfigAnnotationParse configAnnotationParse = new ConfigAnnotationParse(myConfRegister);
        deskConf = configAnnotationParse.parseNodeAnnotation();
    }

    /**
     * 获取配置项信息
     * @param name 项目名称.
     * @param key key名称.
     * @return
     */
    public String getConf(String name, String key) {
        if(deskConf==null)
            return null;

        String component = deskConf.getComponent();
        Conf conf = new Conf();
        conf.setComponent(component);
        conf.setName(name);
        conf.setKey(key);

        String value = DBConf.getValue(conf);

        return value;
    }


    /**
     * 获得所属模块.
     * @return
     */
    public String getComponent() {
        if(deskConf==null)
            return null;

        String component = deskConf.value();

        return component;
    }


}

二、jar包配置使用方式

1、maven依赖

<dependency>
   <groupId>com.jd.app.server</groupId>
   <artifactId>desk-conf</artifactId>
   <version>1.0.0-SNAPSHOT</version>
</dependency>

2、配置项注入样例

/**
 * 
 */
public class TimeConstants extends ConfRegister{

    @DeskConf("online")
    private static String comp = "";

}

3、spring-config.xml 主配置文件中配置

<bean id="timeConstants" class="com.common.constant.TimeConstants"></bean>
<bean id="confService" class="com.jd.app.server.service.impl.ConfServiceImpl">
    <constructor-arg index="0" ref="timeConstants"/>
</bean>

4、使用说明

@Autowired
ConfService confService;

读取监控信息

String value = confService.getConf("findgood","down");

读取模块名称

String com = confService.getComponent();

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px ".AppleSystemUIFont"; color: #040404 } span.s1 { font: 14.0px ".PingFang SC" } div.d1 { width: 474.0px; margin: 15.0px 0.0px 0.0px 15.0px }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • spark实时计算性能优化

    1、  计算提供两种模式,一种是jar包本地计算、一种是JSF服务。 2、  第一步是引入spark,因与netty、JDQ均有冲突,解决netty冲突后,隔离...

    杉枫
  • JAVA JMX协议监控

      JMX协议监控,可通过JMX协议远程监控,实时监控线上jvm情况,并通过平台管理界面进行 展示,可以通过监控实时获得线上服务器运行情况。   可以监控内存、...

    杉枫
  • 两层数组广度优先数据遍历

      当需要轮训取多个分类数据的时候,每个分类一个数组,每个分类取一个再取下一个。 遍历方式总结如下: List<List<String>> list = new...

    杉枫
  • 猿思考系列4——一文学会java的斗转星移动

    看完上一个章节,相信你已经掌握了一些思考的本领了。今天我们来聊一个新的话题。上一篇文章是一个简约的话题,希望简约而不简单。当然,如果觉得太浅了也请立刻告知猿人工...

    山旮旯的胖子
  • 手写一个WEB应用服务

    之前有小伙伴向我请教一道笔试题:要求写出一个WEB应用服务,不得使用Servlet接口,用Socket实现,可以响应get请求,打印请求信息,并判断请求资源,若...

    南风
  • 最简单的web服务器实现(一)(r4笔记第68天)

    tomcat作为web服务器,想必大家做过web开发的都离不开tomcat了,值得庆幸的是tomcat也是开放源代码的,最近准备好好琢磨琢磨tomcat的源码,...

    jeanron100
  • java 利用反射模拟动态语言的 eval 函数

    import java.io.File; import java.io.FileWriter; import java.io.PrintWriter; impo...

    用户1177713
  • 一个Java开发的在线视频下载工具,可以把视频分块下载到本地,再拼凑成完整版

    Jerry Wang
  • mongodb-java-driver基本用法

    1、先下载mongodb-java-driver 目前最新版本是2.9.3 2、下面是基本的CRUD示例代码: 1 package com.cnblogs....

    菩提树下的杨过
  • 远程过程调用 Java RMI 技术 远程控制

    前段时间空闲时期,研究了commonlang3 的jar包。无意中搜索到了RMI 远程过程调用的相关知识。并实际测试了一番。现特此记录以下以备将来不时之需。

    世玉

扫码关注云+社区

领取腾讯云代金券