项目中需要在项目启动时把一些基础公共数据预加载到内存中,由于我们的基础数据是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>
相关推荐
博客地址:... 1. 启动后访问http://localhost:8848/code,可见控制台输出codeMap中的值 2. 新建一个只有key和value两个字段的表code 3. 不要轻易浪费积分下载代码,没什么实质内容
【Spring Boot 使用 Spring Cache 缓存与数据落地到 Redis】\n\n在Spring Boot应用中,Spring Cache是一个强大的工具,可以极大地提升应用的性能,通过缓存非计算性或者昂贵的计算结果。Spring Cache抽象了缓存管理...
7. **自动启动**: 脚本可以配置为系统启动时自动运行,例如通过将`startup.bat`添加到Windows的任务计划程序,实现服务的自启动功能,确保应用在系统开机时即开始提供服务。 8. **使用bat脚本的优势**: 它提供了...
`JarLauncher` 负责将应用的类和静态资源(包括 JSP 页面和网页模板)加载到内存中的类路径。Tomcat 会从这个类路径中获取这些资源,提供 HTTP 服务。 总结来说,Spring Boot 应用启动的原理主要涉及以下步骤: 1....
只需要在`application.properties`中设置`spring.jpa.hibernate.ddl-auto`为`create-drop`或`update`,就能在启动时根据实体类创建或更新表。 5. **安全拦截**: - `http.authorizeRequests()`是配置URL级别的访问...
使用Spring框架时,开发者通常会将所有必要的jar文件(如spring-context、spring-aop、spring-web等)添加到项目的类路径中。"spring-framework-4.3.8.RELEASE"压缩包中的内容应该包括这些jar文件,以及其他相关的...
Spring Boot提供了丰富的测试支持,包括`@SpringBootTest`用于启动整个Spring Boot应用进行集成测试,`@WebMvcTest`用于只启动Web层进行Controller测试,`@DataJpaTest`用于JPA数据访问层的测试等。 9. **日志** ...
在4.21版本中,容器可能已经优化了初始化速度和内存占用,使得应用启动更快、运行更高效。 2. **AOP**:Spring的AOP模块提供了声明式事务管理、日志记录、性能监控等功能。在4.21中,AOP的切面定义可能更加灵活,...
这种策略能够有效地减少应用程序启动时的内存占用,提高系统的性能。 在Hibernate中,延迟加载主要用于关联对象的加载,例如一对多或多对多的关系。默认情况下,当Hibernate查询一个实体时,会同时加载与该实体相关...
- **ETL(提取、转换、加载)**:数据仓库中的数据处理。 - **报告生成**:定期生成报表,如销售统计、用户活动分析等。 6. **监控和管理** - **Spring Batch Admin**:提供Web界面监控作业状态,已不再维护,但...
在这个过程中,Spring会创建一个BeanDefinition,包含了Bean的所有配置信息,但此时Bean并未真正实例化,只是存在于内存中的数据结构。 在`refresh()`中,Spring还会调用`prepareBeanFactory()`,设置BeanFactory的...
10. **性能优化**:Spring 4.0.5还对框架内部进行了多处性能优化,比如减少反射使用、提高容器启动速度和减少内存占用等,从而提升了整体应用的运行效率。 在"spring-4.0.5-libs"这个压缩包中,包含了Spring框架...
具体实现上,可以创建一个专门的配置加载器类,负责监听属性文件的变化并更新到内存中的配置。同时,Spring Quartz的作业和触发器配置可以引用这些动态加载的属性。例如,使用`@Value`注解从属性文件中注入触发器的...
- Spring3.1.1在启动速度和内存消耗方面都有所优化,提升了整体应用性能。 在"lib-Spring3.1.1"压缩包中,包含了Spring框架3.1.1版本的库文件,这些jar包是开发基于Spring的应用所必需的依赖。开发者通常将这些库...
首先,Spring Session是一个用于管理用户会话信息的项目,它能够将用户会话数据存储在外部存储中,而不是存储在服务器的内存中。这对于分布式系统、负载均衡、无状态的微服务架构等场景尤其有用。通过Spring Session...
Spring Boot以其简洁的配置和开箱即用的特性深受开发者喜爱,而这个starter旨在进一步简化缓存的集成和管理,特别是对于那些希望在应用启动时自动加载缓存的开发者。 1. **Spring Boot Starter**: Spring Boot ...
前者用于JPA和Hibernate的集成测试,它会自动配置一个内存数据库并加载实体。后者则允许你在测试前后执行SQL脚本,以准备或清理测试数据。 在Spring Test中,还有`@WebMvcTest`用于控制器层的测试。它会自动配置...
- 切换到root用户,修改系统限制,如`/etc/security/limits.conf`,允许更大的文件描述符和内存锁定 ### 三、SkyWalking配置 1. **SkyWalking-Agent配置**: - 将`skywalking-agent.zip`解压缩,并将其放置在...
在IT行业中,Spring框架与Maven的整合是开发Java企业级应用时不可或缺的一部分。Spring作为一个强大的轻量级应用框架,提供了全面的后端服务管理,包括依赖注入、AOP(面向切面编程)、数据访问、Web开发等。而Maven...
它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud中主要...