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>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot中,可以通过使用初始化方法或者实现CommandLineRunner接口的方式来在应用启动时加载数据内存中。 首先,我们可以在一个类上使用`@Component`注解或者实现`InitializingBean`接口,然后重写其`afterPropertiesSet()`方法,在该方法中可以编写加载数据的逻辑。当Spring容器初始化该类时,`afterPropertiesSet()`方法会自动被调用。 ```java @Component public class DataLoader implements InitializingBean { @Autowired private DataRepository dataRepository; @Override public void afterPropertiesSet() throws Exception { // 在这里编写加载数据内存的逻辑 List<Data> dataList = loadDataFromDatabase(); dataRepository.loadDataToMemory(dataList); } private List<Data> loadDataFromDatabase() { // 从数据库中查询数据 // ... } } ``` 另外一种方式是实现`CommandLineRunner`接口,在该接口的`run()`方法中编写加载数据的逻辑。Spring Boot启动时会扫描实现了`CommandLineRunner`接口的Bean并自动调用其`run()`方法。 ```java @Component public class DataLoader implements CommandLineRunner { @Autowired private DataRepository dataRepository; @Override public void run(String... args) throws Exception { // 在这里编写加载数据内存的逻辑 List<Data> dataList = loadDataFromDatabase(); dataRepository.loadDataToMemory(dataList); } private List<Data> loadDataFromDatabase() { // 从数据库中查询数据 // ... } } ``` 以上示例中,我们通过`DataRepository`组件将从数据库中查询的数据加载到了内存中,可以根据实际需求进行调整。通过以上两种方式,我们可以在Spring Boot应用启动时加载数据内存,以便后续的业务逻辑使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值