springmvc启动时从数据库中初始化系统常量

硅谷探秘者 5349 0 0

springmvc启动时从数据库中初始化系统常量


        设计的目标是,把项目的系统常量配置,放在数据库中,在项目初始化时从项目中获取配置信息,利用反射技术,把key-value对应的值自动封装进配置类。


1.例:数据库中的字段与实体类中的key对应,实现自动封装

QQ截图20190304143830.png


QQ截图20190304143903.png

2.实体类:

package club.jiajiajia.resume.common.entity;

public class KeyValue {
	private Integer id;
	private String key;
	private String value;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getKey() {
		return key;
	}
	public void setKey(String key) {
		this.key = key;
	}
	public String getValue() {
		return value;
	}
	public void setValue(String value) {
		this.value = value;
	}
}	

3.系统配置类:

package club.jiajiajia.resume.common.util;
/**
 *系统常量配置 
 */
public class SystemConstants {

	private static String path;//项目路径

	private static String photo_url;//头像url路径
	
	private static int id;//int 类型id
	
	private static Integer num;//Integer 类型num
	
	public static String getPath() {
		return path;
	}

	public static String getPhoto_url() {
		return photo_url;
	}

	public static Integer getId() {
		return id;
	}

	public static Integer getNum() {
		return num;
	}
}

4.项目启动时执行controller,利用反射技术实现自动封装

package club.jiajiajia.resume.common.controller;

import java.lang.reflect.Field;
import java.util.List;

import javax.servlet.ServletContext;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.context.ServletContextAware;

import club.jiajiajia.resume.common.dao.SystemMapper;
import club.jiajiajia.resume.common.entity.KeyValue;
import club.jiajiajia.resume.common.util.SystemConstants;
/**
 * 从数据库中初始化参数
 * @author Administrator
 */
public class SystemController implements InitializingBean, ServletContextAware {
    
	@Autowired
	private SystemMapper systemMapper;
	
	/***
	 * 系统配置自动化封装
	 */
    @Override
    public void setServletContext(ServletContext arg0){
    	List<KeyValue> sys=systemMapper.system();
    	Class<?> c=SystemConstants.class;
    	Field f=null;
    	for(KeyValue kv:sys){
    		if(kv.getValue()!=null&&!"".equals(kv.getValue())){
				try {
					f=c.getDeclaredField(kv.getKey());
					f.setAccessible(true);
					if(f.getType()==int.class||f.getType()==Integer.class){
						f.set(SystemConstants.class,new Integer(kv.getValue()));
					}else if(f.getType()==String.class){
						f.set(SystemConstants.class,kv.getValue());
					}
				} catch (NoSuchFieldException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (SecurityException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (NumberFormatException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IllegalArgumentException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IllegalAccessException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
    		}
    	}
    }
    @Override
    public void afterPropertiesSet() throws Exception {
        // TODO Auto-generated method stub
    }
}

5.访问数据库:

package club.jiajiajia.resume.common.dao;

import java.util.List;

import club.jiajiajia.resume.common.entity.KeyValue;

public interface SystemMapper {
	public List<KeyValue> system();
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="club.jiajiajia.resume.common.dao.SystemMapper" >
  <select id="system" resultType="club.jiajiajia.resume.common.entity.KeyValue">
  	SELECT sc.id,sc.key,sc.value from system_config sc
  </select>
</mapper>

6.applicationContext.xml配置:放进ioc容器中

<bean class="club.jiajiajia.resume.common.controller.SystemController"></bean>


        这样系统启动的时候就会初始化执行SystemController类,自动封装属性


QQ截图20190304144521.png

        但注意:数据库中的value字段的值一定要与属性的类型对应,不可能int类型的属性放一个字符串的值。

猜你喜欢
数据库基础 3406 产生原因:区不一致解决办法:在链接加:&serverTimezone=Asia/Shanghaiurl:jdbc:mysql://localhost:3306/test
spring/springmvc 4004 springmvc项目执行controller在springmvc的配置文件加入controller的bean,注意bean加载的顺序beanclass
weblog 758 首先到tomcat的安装目录(解压目录)执行如下命令即可运行:./bin/startup.sh或者直接到bin目录下执行如下命令:./startup.shtomcat的默认端口是8080如果是在centos7版本部署的tomcat服务器,需要将8080端口放开执行如下命令:firewall-cmd--zone=public--add-port=8080/tcp--permanentfirewall
java 数据库 2003 java项目-之间定进行交换服务(右上方下载)压缩包内附sql脚本,本项目为springboot+mybatis框架,导入项目即可测试。目的,实现两个进行同步,定
java基础,springboot 666 修改成正确的用户即可 将服务设置为开机: sudosystemctlenablemyApp 三、自定义JVM参  如果是用java-jar的方式的java应用,我们可以直接在命令行指定
weblog 2853 定义组int[,]area={{0,0},{0,1},{1,0},{0,-1},{-1,0},{1,1},{1,-1},{-1,-1},{-1,1}};遍历组for(inti=0
框架 6984 springboot项目后执行特定方法有项目需求,需要项目候向查询一下属性,或者需要加载某个特定的方法。那么在springboot可以用如下方法实现第一种实现,实现
spring/springmvc 1703 springmvc一返回异信息当服务器代码为: @RequestMapping("/res") publicMyAjaxResultres(@RequestParam(name
归档
2018年11月  12 2018年12月  33 2019年01月  28 2019年02月  28 2019年03月  32 2019年04月  27 2019年05月  33 2019年06月  6 2019年07月  12 2019年08月  12 2019年09月  21 2019年10月  8 2019年11月  15 2019年12月  25 2020年01月  9 2020年02月  5 2020年03月  16 2020年04月  4 2020年06月  1 2020年07月  7 2020年08月  13 2020年09月  9 2020年10月  5 2020年12月  3 2021年01月  1 2021年02月  5 2021年03月  7 2021年04月  4 2021年05月  4 2021年06月  1 2021年07月  7 2021年08月  2 2021年09月  8 2021年10月  9 2021年11月  16 2021年12月  14 2022年01月  7 2022年05月  1 2022年08月  3 2022年09月  2 2022年10月  2 2022年12月  5 2023年01月  3
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo vue 导入导出 软件使用 idea插件 协议 无聊的知识 jenkins springboot mqtt协议 keepalived minio mysql ensp 网络基础 xxl-job rabbitmq haproxy
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。