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 条评论
登录 后参与评论

相关文章

来自专栏cloudskyme

jbpm5.1介绍(9)

Junit测试调用子流程 下面的示例中测试在程序中调用其它程序的子流程的示例,需要加载两个配置文件 ? 和 ? 需要指定属性 下面是调用的示例程序 publ...

3336
来自专栏Hongten

python开发_pprint()

1094
来自专栏开发与安全

linux网络编程之POSIX 共享内存和 系列函数

在前面介绍了system v 共享内存的相关知识,现在来稍微看看posix 共享内存 和系列函数。 共享内存简单来说就是一块真正的物理内存区域,可以使用一些函数...

2220
来自专栏技术小黑屋

Javac:command Not Found

I have been getting well on with my java tool.However When I use the javac comma...

2592
来自专栏javathings

@Async 注解的使用

在 Spring 中,@Async 标注的方法,在执行的时候,是异步运行的,它运行在独立的线程中,程序不会被该方法所阻塞。

1.3K2
来自专栏技术专栏

自定义valida验证注解

1414
来自专栏JackieZheng

照虎画猫写自己的Spring——自定义注解

Fairy已经实现的功能 读取XML格式配置文件,解析得到Bean 读取JSON格式配置文件,解析得到Bean 基于XML配置的依赖注入 所以,理所当然,今天该...

2919
来自专栏小灰灰

动手实现MVC: 2. bean加载, IoC依赖注入

背景 前面实现了java包的扫描,扫描之后自然就到了bean的加载,以及spring mvc的一大特性 IoC依赖注入的实现; 这里则将在之前的基础上,实现be...

1947
来自专栏我叫刘半仙

原 荐 自己手写一个SpringMVC框架(简化)

       Spring框架对于Java后端程序员来说再熟悉不过了,以前只知道它用的反射实现的,但了解之后才知道有很多巧妙的设计在里面。如果不看Spring的...

6096
来自专栏光变

Spring PlaceHolder使用注意事项

对Spring Property Placeholder如何使用,以及使用过程中遇到的问题做了简单的描述。

1011

扫码关注云+社区

领取腾讯云代金券