`
doubleyoung
  • 浏览: 17201 次
  • 性别: 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. 不要轻易浪费积分下载代码,没什么实质内容

    springboot 使用spring cache缓存 和 缓存数据落地到redis

    【Spring Boot 使用 Spring Cache 缓存与数据落地到 Redis】\n\n在Spring Boot应用中,Spring Cache是一个强大的工具,可以极大地提升应用的性能,通过缓存非计算性或者昂贵的计算结果。Spring Cache抽象了缓存管理...

    springboot项目启动bat脚本

    7. **自动启动**: 脚本可以配置为系统启动时自动运行,例如通过将`startup.bat`添加到Windows的任务计划程序,实现服务的自启动功能,确保应用在系统开机时即开始提供服务。 8. **使用bat脚本的优势**: 它提供了...

    spring boot应用启动原理分析.docx

    `JarLauncher` 负责将应用的类和静态资源(包括 JSP 页面和网页模板)加载到内存中的类路径。Tomcat 会从这个类路径中获取这些资源,提供 HTTP 服务。 总结来说,Spring Boot 应用启动的原理主要涉及以下步骤: 1....

    Spring security认证授权

    只需要在`application.properties`中设置`spring.jpa.hibernate.ddl-auto`为`create-drop`或`update`,就能在启动时根据实体类创建或更新表。 5. **安全拦截**: - `http.authorizeRequests()`是配置URL级别的访问...

    spring jar包最新版

    使用Spring框架时,开发者通常会将所有必要的jar文件(如spring-context、spring-aop、spring-web等)添加到项目的类路径中。"spring-framework-4.3.8.RELEASE"压缩包中的内容应该包括这些jar文件,以及其他相关的...

    spring-boot-reference2018最新版

    Spring Boot提供了丰富的测试支持,包括`@SpringBootTest`用于启动整个Spring Boot应用进行集成测试,`@WebMvcTest`用于只启动Web层进行Controller测试,`@DataJpaTest`用于JPA数据访问层的测试等。 9. **日志** ...

    Spring 4.21 全部jar

    在4.21版本中,容器可能已经优化了初始化速度和内存占用,使得应用启动更快、运行更高效。 2. **AOP**:Spring的AOP模块提供了声明式事务管理、日志记录、性能监控等功能。在4.21中,AOP的切面定义可能更加灵活,...

    Hibernate延迟加载以及利用Spring

    这种策略能够有效地减少应用程序启动时的内存占用,提高系统的性能。 在Hibernate中,延迟加载主要用于关联对象的加载,例如一对多或多对多的关系。默认情况下,当Hibernate查询一个实体时,会同时加载与该实体相关...

    详细spring batch资料

    - **ETL(提取、转换、加载)**:数据仓库中的数据处理。 - **报告生成**:定期生成报表,如销售统计、用户活动分析等。 6. **监控和管理** - **Spring Batch Admin**:提供Web界面监控作业状态,已不再维护,但...

    从Dubbo启动看Dubbo和Spring的关系1

    在这个过程中,Spring会创建一个BeanDefinition,包含了Bean的所有配置信息,但此时Bean并未真正实例化,只是存在于内存中的数据结构。 在`refresh()`中,Spring还会调用`prepareBeanFactory()`,设置BeanFactory的...

    spring 4.0.5 jar包

    10. **性能优化**:Spring 4.0.5还对框架内部进行了多处性能优化,比如减少反射使用、提高容器启动速度和减少内存占用等,从而提升了整体应用的运行效率。 在"spring-4.0.5-libs"这个压缩包中,包含了Spring框架...

    动态加载属性文件与SpringQuartz的应用

    具体实现上,可以创建一个专门的配置加载器类,负责监听属性文件的变化并更新到内存中的配置。同时,Spring Quartz的作业和触发器配置可以引用这些动态加载的属性。例如,使用`@Value`注解从属性文件中注入触发器的...

    Spring3.1.1

    - Spring3.1.1在启动速度和内存消耗方面都有所优化,提升了整体应用性能。 在"lib-Spring3.1.1"压缩包中,包含了Spring框架3.1.1版本的库文件,这些jar包是开发基于Spring的应用所必需的依赖。开发者通常将这些库...

    解决Spring session(redis存储方式)监听导致创建大量redisMessageListenerContailner-X线程问题

    首先,Spring Session是一个用于管理用户会话信息的项目,它能够将用户会话数据存储在外部存储中,而不是存储在服务器的内存中。这对于分布式系统、负载均衡、无状态的微服务架构等场景尤其有用。通过Spring Session...

    autoload-cache-spring-boot-starter:自动加载缓存spring boot starter

    Spring Boot以其简洁的配置和开箱即用的特性深受开发者喜爱,而这个starter旨在进一步简化缓存的集成和管理,特别是对于那些希望在应用启动时自动加载缓存的开发者。 1. **Spring Boot Starter**: Spring Boot ...

    spring test

    前者用于JPA和Hibernate的集成测试,它会自动配置一个内存数据库并加载实体。后者则允许你在测试前后执行SQL脚本,以准备或清理测试数据。 在Spring Test中,还有`@WebMvcTest`用于控制器层的测试。它会自动配置...

    spring-cloud+skywalking链路跟踪1

    - 切换到root用户,修改系统限制,如`/etc/security/limits.conf`,允许更大的文件描述符和内存锁定 ### 三、SkyWalking配置 1. **SkyWalking-Agent配置**: - 将`skywalking-agent.zip`解压缩,并将其放置在...

    spring+maven整合

    在IT行业中,Spring框架与Maven的整合是开发Java企业级应用时不可或缺的一部分。Spring作为一个强大的轻量级应用框架,提供了全面的后端服务管理,包括依赖注入、AOP(面向切面编程)、数据访问、Web开发等。而Maven...

    spring-boot级spring-cloud视频教学

    它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud中主要...

Global site tag (gtag.js) - Google Analytics