`

加载数据库配置信息到spring容器中

    博客分类:
  • java
阅读更多
package com.sf.wop.common.util;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanInitializationException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.transaction.annotation.Transactional;

public class PropertyPlaceholderConfigurerBD extends PropertyPlaceholderConfigurer {
	private static final Logger logger = LoggerFactory.getLogger(PropertyPlaceholderConfigurerBD.class);

	private JdbcTemplate jdbcTemplate;

	@Transactional
	public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
		try {
			Properties mergedProps = loadIKafkaProp();

			if (mergedProps == null || mergedProps.size() == 0) {
				mergedProps = mergeProperties();
			}
			mergedProps.putAll(loadQuartzProp());
			mergedProps.putAll(loadSystemConfig());
			
			convertProperties(mergedProps);
			processProperties(beanFactory, mergedProps);

			Properties prop = System.getProperties();
			prop.putAll(mergedProps);

		} catch (Exception ex) {
			throw new BeanInitializationException("Could not load properties", ex);
		}
	}

	/**
	 * @see 从数据库加载配置项
	 **/
	private Properties loadIKafkaProp() {
		Properties properties = new Properties();
		List<Map<String, Object>> result = jdbcTemplate
				.queryForList("select * from tb_kafka_config where is_delete = 0 ");
		if (result == null || result.size() == 0) {
			logger.error("no property found.");
			return properties;
		}
		logger.info(" query KafkaConfig  OK !");

		Map<String, String> map = new HashMap<String, String>();

		for (Map<String, Object> record : result) {
			String paramkey = String.valueOf(record.get("kafka_key"));
			map.put(paramkey + ".url", String.valueOf(record.get("url")));
			map.put(paramkey + ".clusterName", String.valueOf(record.get("cluster_name")));
			map.put(paramkey + ".topic", String.valueOf(record.get("topic")));
			map.put(paramkey + ".topicToken", String.valueOf(record.get("topic_token")));
			map.put(paramkey + ".threadCount", String.valueOf(record.get("thread_count")));
			if (null != record.get("fetch_data_queue_size")) {
				map.put(paramkey + ".fetchDataQueueSize", String.valueOf(record.get("fetch_data_queue_size")));
			}
			if (null != record.get("message_group_size")) {
				map.put(paramkey + ".messageGroupSize", String.valueOf(record.get("message_group_size")));
			}
			if (null != record.get("pack_data_queue_size")) {
				map.put(paramkey + ".packDataQueueSize", String.valueOf(record.get("pack_data_queue_size")));
			}
		}
		properties.putAll(map);
		return properties;
	}

	/**
	 * @see 从数据库加载quartz CronExpression表达式
	 **/
	private Properties loadQuartzProp() {
		Properties properties = new Properties();
		List<Map<String, Object>> result = jdbcTemplate.queryForList("select * from tb_quartz_cronexpression_config");
		if (result == null || result.size() == 0) {
			logger.error("no QuartzConfig property found.");
			return properties;
		}
		logger.info("query QuartzConfig OK !");

		for (Map<String, Object> record : result) {
			String triggerName = String.valueOf(record.get("trigger_name"));
			properties.put(triggerName + ".cronExpression", String.valueOf(record.get("cron_expression")));
		}
		return properties;
	}

	@SuppressWarnings("null")
	private Properties loadSystemConfig() {
		Properties properties = new Properties();
		List<Map<String, Object>> list = jdbcTemplate
				.queryForList("select t.config_code,t.config_value from ts_system_config t where t.`status`=1");
		if (list != null && list.size() > 0) {
			for (Map<String, Object> map : list) {
				properties.put(map.get("config_code"), map.get("config_value"));
			}
		}

		return properties;
	}

	public JdbcTemplate getJdbcTemplate() {
		return jdbcTemplate;
	}

	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}
}

 

分享到:
评论
2 楼 wddpwzzhao123 2016-12-20  
需要在spring配置文件里引用这个类
1 楼 yckiven 2016-12-01  
敢问 测试过了么

相关推荐

    详解spring boot容器加载完后执行特定操作

    在 Spring Boot 应用程序中,容器加载完成后,框架会触发 ContextRefreshedEvent 事件,该事件表明容器已经加载完成,可以执行特定操作了。我们可以创建一个实现 ApplicationListener 接口的类,用于监听 ...

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

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

    定时器(quartz+spring)读取数据库配置

    最后,启动Spring容器,Quartz会自动加载数据库中的Job和Trigger配置,按照设定的时间执行相应的任务。 通过这种方式,我们可以构建一个高度可扩展和可配置的定时任务系统,只需在数据库中修改Job和Trigger的配置,...

    Spring动态加载配置文件

    在Spring框架中,动态加载配置文件是一项重要的...总的来说,Spring动态加载配置文件涉及到IoC容器、属性源、配置加载策略和刷新机制等多个方面。理解和掌握这些知识点,可以帮助我们构建更加灵活和适应性强的应用。

    Spring 容器后处理器

    下面是一个简单的容器后处理器实现示例,展示了如何实现BeanFactoryPostProcessor接口并注册到Spring容器中。 ```java public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor { @Override...

    Spring定时调度——将调度信息持久化到数据库中

    5. 注册`DatabaseScheduledTaskRegistrar`到Spring容器中。 配置文件中,你需要将Spring的默认`ThreadPoolTaskScheduler`替换为你的`DatabaseScheduledTaskRegistrar`: ```xml &lt;!-- 配置数据库连接等信息 ...

    Spring配置文件集合

    9. `applicationContext.xml`: 这是Spring容器的主配置文件,用于定义Bean的实例化、依赖注入、bean之间的关系等。它是Spring应用上下文的基础,包含了所有业务对象和服务的配置。 通过这些配置文件的组合,我们...

    springboot[1]-多模块共用配置文件.zip

    - **配置类**:如果配置较多,可以创建一个配置类,通过`@ConfigurationProperties`注解映射配置文件中的属性,并通过`@ComponentScan`扫描该配置类,确保其被Spring容器管理。 4. **Profile支持** - Spring Boot...

    SSM(Spring+SpringMvc+Mybatis)图片上传保存到数据库与回显+sql

    在这个项目中,我们主要关注的是如何在SSM框架下实现图片上传并将其信息存储到数据库,以及如何将已存储的图片信息回显出来。 首先,`Spring`作为核心容器,负责管理应用中的所有Bean,提供依赖注入(Dependency ...

    spring 配置文件详解

    Spring 配置文件是一个或多个标准的 XML 文档,applicationContext.xml 是 Spring 的默认配置文件,当容器启动时找不到指定的配置文档时,将会尝试加载这个默认的配置文件。 在 Spring 配置文件中,主要包含了以下...

    spring 下载与配置

    如果是传统的Spring应用,可以通过ApplicationContext接口来创建一个容器并加载配置。如果是Spring Boot应用,通常会有一个主启动类,其中包含@SpringBootApplication注解,它会自动加载配置并启动应用。 ```java ...

    activiti工作流demo,数据库使用mysql,spring + mybatis + activiti,里面参.zip

    4. **配置Activiti**:在Spring配置中设置Activiti的配置,如流程定义资源的加载路径。 5. **定义流程模型**:使用Activiti提供的建模工具或直接编写XML流程定义文件(.bpmn)来设计工作流程。 6. **编写Service类**...

    Spring Boot技术知识点:如何获取application.yml配置文件里的相关属性(方法1)

    一旦配置类被定义并添加到Spring容器中,我们可以在任何需要的地方注入`CustomProperties`,然后通过getter方法获取属性值: ```java package com.example.service; import com.example.config.CustomProperties; ...

    Spring—下载与配置

    在完成了基本配置后,你可以通过ApplicationContext接口来启动Spring容器并访问bean: ```java import org.springframework.context.ApplicationContext; import org.springframework.context.support....

    spring ioc容器部署实现

    根据应用需求,编写具体的业务逻辑类和服务类,并通过注解或XML配置的方式将其与Spring容器绑定。 5. **集成Spring JDBC Template** 使用Spring JDBC Template简化数据库操作。首先,在配置文件中定义数据源和...

    Spring中进行集成测试

    通过这个注解,你可以将测试类与Spring的ApplicationContext关联起来,使测试类可以访问到容器中的bean。 2. **测试配置**:在Spring测试中,你可以使用`@ContextConfiguration`注解来指定配置文件或带有`@...

    Spring Boot容器加载时执行特定操作(推荐)

    例如,在容器加载完成后,可能需要执行一些初始化操作,例如加载配置文件、建立数据库连接等。在容器关闭前,可能需要执行一些清理操作,例如释放资源、关闭连接等。 因此,了解 Spring Boot 中的事件机制,可以...

    Spring4中文文档

    文档最后还涉及到了Spring容器的扩展点,如BeanPostProcessor和BeanFactoryPostProcessor,这些扩展点让开发者有机会在Spring容器实例化Bean前后以及加载配置元数据前后执行自定义逻辑。 整体来看,Spring4中文文档...

    spring 启动时加载不同的文件

    - 将选定的文件内容合并到`Properties`对象中,并通过父类的`processProperties`方法加载到Spring容器中。 **5. setGollfPropFiles方法实现** ```java protected void processProperties...

    Spring的IoC容器

    4. **获取Bean**:使用`getBean()`方法从容器中获取Bean实例,进行业务操作。 5. **依赖注入**:容器自动处理Bean之间的依赖关系,无需在代码中显式创建或查找依赖对象。 ### 5. 进阶使用 - **AOP代理**:IoC容器...

Global site tag (gtag.js) - Google Analytics