`
doubleyoung
  • 浏览: 16862 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类

Spring 启动时加载数据到内存

 
阅读更多

       项目中需要在项目启动时把一些基础公共数据预加载到内存中,由于我们的基础数据是XML配置的方式,所以直接利用spring的注入,在配置文件中配置就可以了。

先是Java代码如下,采用map里面存map的形式:

 

public class PublicCode {

    public static Map<String, Map<String, String>> codeMap = new HashMap<String, Map<String, String>>();

    public Map<String, Map<String, String>> getCodeMap() {
        return codeMap;
    }

    public static String getNameChn(String type, String key) {

        return codeMap.get(type).get(key);
    }
}

 XML代码如下,

 

 

    <bean id="publicCode" class="com.util.PublicCode"/>

    <bean id="codeMap" class="java.util.HashMap">
        <constructor-arg>
            <map>
                <entry key="productType" value-ref="productType"/>
                <entry key="userType" value-ref="userType"/>
            </map>
        </constructor-arg>
    </bean>

    <bean id="productType" class="java.util.HashMap">
        <constructor-arg>
            <map>
                <entry key="1" value="产品1"/>
                <entry key="2" value="产品2"/>
                <entry key="3" value="产品3"/>
                <entry key="4" value="产品4"/>
                <entry key="5" value="产品5"/>
            </map>
        </constructor-arg>
    </bean>

 

 

还有第二种方式,实现BeanPostProcessor 接口,这种方式适合从DB中读取一次性加载。下面实例仍然是从XML读取:

 

public class CommonCodeBeanPostProcessor implements BeanPostProcessor {
	public Object postProcessBeforeInitialization(Object bean, String beanName)
			throws BeansException {
		if(bean instanceof CommonCode) {  
			((CommonCode)bean).loadMap();
		}
		return bean;
	}
	public Object postProcessAfterInitialization(Object bean, String beanName)
			throws BeansException {
		return bean;
	}
}

 

public class CommonCode {
	
	public static final String NAME = "name";
	
	public static final String KEY = "key";
	
	public static final String VALUE = "value";
	
	public static final Map<String, Map> MAP = new HashMap<String, Map>();
	
	private Resource resourceXML;
	
	public CommonCode() {
		
	}
	
	public void loadMap() {
		Assert.notNull(resourceXML,"resourceXML must be not null");
		try {
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = factory.newDocumentBuilder();
			Document doc = builder.parse(resourceXML.getInputStream());
			Element root = doc.getDocumentElement();
			if (root == null) {
				return;
			}
			NodeList codeNodeList = root.getChildNodes();
			String name = null;
			for (int i=0; i < codeNodeList.getLength(); i++) {
				Node node = (Node) codeNodeList.item(i); 
				if (node != null && node.getNodeType() == Node.ELEMENT_NODE) { 
					name = node.getAttributes().getNamedItem(NAME).getNodeValue();
					Map m = null;
					if (!MAP.containsKey(name)) {
						m = new HashMap();
						MAP.put(name, m);
					} else {
						m = (Map) MAP.get(name);
					}
					NodeList keyValues = node.getChildNodes();
					for (int j=0; j < keyValues.getLength(); j++) {
						Node key = (Node)keyValues.item(j);
						if (key != null && key.getNodeType() == Node.ELEMENT_NODE) { 
							m.put(key.getAttributes().getNamedItem(KEY).getNodeValue(), key.getAttributes().getNamedItem(VALUE).getNodeValue());
						}
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public Resource getResourceXML() {
		return resourceXML;
	}

	public void setResourceXML(Resource resourceXML) {
		this.resourceXML = resourceXML;
	}

}

 Spring配置如下:

 

 

<bean id="commonCode" class="javacommon.util.CommonCode">
	<property name="resourceXML" value="classpath:commonCode.xml"/>
</bean>
<bean id="commonCodeBeanPostProcess" class="javacommon.util.CommonCodeBeanPostProcessor" />

 

 

CommonCode.xml:

<?xml version="1.0" encoding="UTF-8"?>
<entries>
	<entry name="industry">
		<object key="1" value="金融服务/投资" />
		<object key="2" value="房地产" />
		<object key="3" value="基础设施" />
		<object key="4" value="能源" />
	</entry>
	
	<entry name="productType">
		<object key="1" value="产品1" />
		<object key="2" value="产品2" />
		<object key="3" value="产品3" />
		<object key="4" value="产品4" />
		<object key="5" value="产品5" />
	</entry>
</entries>

 

分享到:
评论

相关推荐

    Springboot项目启动时加载数据库数据到内存.rar

    博客地址:... 1. 启动后访问http://localhost:8848/code,可见控制台输出codeMap中的值 2. 新建一个只有key和value两个字段的表code 3. 不要轻易浪费积分下载代码,没什么实质内容

    spring.xls

    * 有可能会造成一些数据长时间驻留在内存中 * lazy-init为"true"当context.getBean时创建 bean为多例时,必须用这种方案创建对象 * 不能及时发现错误 * 数据会在需要的时候加载 * 初始化 * 由spring容器调用...

    SpringBoot启动过程-mind版.md

    1. **加载配置:** Spring Boot会读取项目中的配置文件(如`application.properties`或`application.yml`),并将其中的配置信息加载到内存中,以供后续使用。 2. **初始化应用上下文:** Spring Boot会创建一个...

    Spring面试题

    当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。 3.Hibernate中怎样实现类之间的...

    microservices:使用Spring Boot,Spring Cloud Config,Spring Security,Eureka,Hystrix,Zuul,PostgreSql的微服务

    为了使这种体系结构接近行业标准,我在数据库中创建了一些帐户和资产,这些帐户和资产将用于将数据加载到内存中。 启动服务的步骤: 启动spring-cloud-config-server从本地/远程存储库加载所有配置文件。 启动...

    spring-security:授权+资源服务器

    将数据存储在内存H2数据库中。 定义UserDetails,UserDetailsS​​ervice,ClientDetails,ClientDetails服务以起誓。 使服务器可以用作授权和资源服务器,并提供必要的配置类来创建和注册所需作用域所需的每个bean...

    java相关的2024面试题集锦

    - 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制 - 类加载机制采用懒加载的方式 - 遇到new、getstatic、...

    Tomcat内存溢出的三种情况及解决办法分析

    这500M内存中的一部分必须用于系统dll的加载,那么真正剩下的也许只有400M,现在关键的地方出现了:当你使用Java创建一个线程,在JVM的内存里也会创建一个Thread对象,但是同时也会在操作系统里创建一个真正的物理...

    thymeleaf-test:与 Thymeleaf 集成的 Spring 测试

    因此,您只需将 WAR 文件放入 Tomcat,它就会创建表、加载演示数据并启动。依赖关系Tomcat 7 Java 1.7(也适用于 1.6) 春天 4 百里香叶 2.1.4 H2 数据库引擎特征富文本编辑器是用实现的。 该包已下载并放置在 src/...

    spring-rest:带有REST和H2的Spring展位应用

    启动应用程序:导航到myartifact目录./gradlew bootRun 创建人员$ curl -i -X POST -H“ Content-Type:application / json” -d'{“ firstName”:“ John”,“ lastName”:“ Doe”}' 更新Perso

    java面试题

    答:声明式的事务管理主要是将在进行对数据库中数据的添加或者修改时需要执行事务管理,主要是为了避免在执行添加或修改的时候添加或修改不完全正确,导致数据丢失。spring使用AOP面向切面的思想进行事务管理的。 ...

    wsdl2java源码-service-virtualization:服务虚拟化是在软件开发生命周期的预生产阶段模拟不可用或以其他方式受限的软

    在内存数据库中:(即使重新启动,您也会丢失旧数据) virtualan.datasource.driver-class-name=org.hsqldb.jdbcDriver virtualan.datasource.jdbcurl=jdbc:hsqldb:mem:dataSource virtualan.datasource.username=sa...

    Nginx安装包

    再看看我们redis服务器,可以看到里面已经添加了一些数据,有些session是spring自己添加的,具体什么意思我也不是很清楚,但我们找一下,就可以找到我们刚刚添加的session。其中右上角的TIL是我们session剩余有效...

    SoftBS:Spring Boot v2.1.13 + Mybatis3 + ZK9 + Bootstrap v4 + Docker

    稍后将添加的安全框架:它可以是Spring Security,JMT或Apache Shiro LogBack用作日志记录框架 HikariCP用于数据源连接,其注册名称为“ SoftBSHikariCP” Jacoco代码覆盖率 您可以使用HSQL内存数据库,MariaDB或...

    java面试宝典

    168、Prototype如何为一个Ajax添加一个参数? 40 169、Ajax请求总共有多少种Callback? 41 170、Javascript如何发送一个Ajax请求? 41 171、AJAX都有哪些有点和缺点? 41 172、Ajax和javascript的区别? 41 Servlet...

    千方百计笔试题大全

    168、Prototype如何为一个Ajax添加一个参数? 40 169、Ajax请求总共有多少种Callback? 41 170、Javascript如何发送一个Ajax请求? 41 171、AJAX都有哪些有点和缺点? 41 172、Ajax和javascript的区别? 41 Servlet...

    CAE677AE9FA42A77861632D210A48E99393B6D17F517C1BED55E7A3386882CE9

    请注意,该项目使用内存缓存来存储数据,因此所有数据在重新启动时都会丢失。 通过为特定数据源创建DAO并实现QueueDao接口,可以轻松地对此进行修改。 然后可以使用其他数据源而不是InMemoryQueue对象来实例化...

    JAVA上百实例源码以及开源项目源代码

    像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java编写的显示器显示模式检测程序 2个目标文件 内容...

    centos7.5分布式平台搭建.docx

    13.6. 添加系统服务自启动 56 13.7. Head安装 57 13.8. 登陆地址 57 13.9. ES跨域访问配置 57 13.10. IK分词器安装 57 13.11. Cerebro配置 57 13.12. 集群使用经验 58 13.13. 问题整理 58 14. Elasticsearch与...

Global site tag (gtag.js) - Google Analytics