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; } }
相关推荐
在 Spring Boot 应用程序中,容器加载完成后,框架会触发 ContextRefreshedEvent 事件,该事件表明容器已经加载完成,可以执行特定操作了。我们可以创建一个实现 ApplicationListener 接口的类,用于监听 ...
博客地址:... 1. 启动后访问http://localhost:8848/code,可见控制台输出codeMap中的值 2. 新建一个只有key和value两个字段的表code 3. 不要轻易浪费积分下载代码,没什么实质内容
在Spring框架中,动态加载配置文件是一项重要的...总的来说,Spring动态加载配置文件涉及到IoC容器、属性源、配置加载策略和刷新机制等多个方面。理解和掌握这些知识点,可以帮助我们构建更加灵活和适应性强的应用。
最后,启动Spring容器,Quartz会自动加载数据库中的Job和Trigger配置,按照设定的时间执行相应的任务。 通过这种方式,我们可以构建一个高度可扩展和可配置的定时任务系统,只需在数据库中修改Job和Trigger的配置,...
下面是一个简单的容器后处理器实现示例,展示了如何实现BeanFactoryPostProcessor接口并注册到Spring容器中。 ```java public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor { @Override...
5. 注册`DatabaseScheduledTaskRegistrar`到Spring容器中。 配置文件中,你需要将Spring的默认`ThreadPoolTaskScheduler`替换为你的`DatabaseScheduledTaskRegistrar`: ```xml <!-- 配置数据库连接等信息 ...
9. `applicationContext.xml`: 这是Spring容器的主配置文件,用于定义Bean的实例化、依赖注入、bean之间的关系等。它是Spring应用上下文的基础,包含了所有业务对象和服务的配置。 通过这些配置文件的组合,我们...
在这个项目中,我们主要关注的是如何在SSM框架下实现图片上传并将其信息存储到数据库,以及如何将已存储的图片信息回显出来。 首先,`Spring`作为核心容器,负责管理应用中的所有Bean,提供依赖注入(Dependency ...
Spring 配置文件是一个或多个标准的 XML 文档,applicationContext.xml 是 Spring 的默认配置文件,当容器启动时找不到指定的配置文档时,将会尝试加载这个默认的配置文件。 在 Spring 配置文件中,主要包含了以下...
如果是传统的Spring应用,可以通过ApplicationContext接口来创建一个容器并加载配置。如果是Spring Boot应用,通常会有一个主启动类,其中包含@SpringBootApplication注解,它会自动加载配置并启动应用。 ```java ...
一旦配置类被定义并添加到Spring容器中,我们可以在任何需要的地方注入`CustomProperties`,然后通过getter方法获取属性值: ```java package com.example.service; import com.example.config.CustomProperties; ...
在完成了基本配置后,你可以通过ApplicationContext接口来启动Spring容器并访问bean: ```java import org.springframework.context.ApplicationContext; import org.springframework.context.support....
4. **配置Activiti**:在Spring配置中设置Activiti的配置,如流程定义资源的加载路径。 5. **定义流程模型**:使用Activiti提供的建模工具或直接编写XML流程定义文件(.bpmn)来设计工作流程。 6. **编写Service类**...
根据应用需求,编写具体的业务逻辑类和服务类,并通过注解或XML配置的方式将其与Spring容器绑定。 5. **集成Spring JDBC Template** 使用Spring JDBC Template简化数据库操作。首先,在配置文件中定义数据源和...
通过这个注解,你可以将测试类与Spring的ApplicationContext关联起来,使测试类可以访问到容器中的bean。 2. **测试配置**:在Spring测试中,你可以使用`@ContextConfiguration`注解来指定配置文件或带有`@...
例如,在容器加载完成后,可能需要执行一些初始化操作,例如加载配置文件、建立数据库连接等。在容器关闭前,可能需要执行一些清理操作,例如释放资源、关闭连接等。 因此,了解 Spring Boot 中的事件机制,可以...
文档最后还涉及到了Spring容器的扩展点,如BeanPostProcessor和BeanFactoryPostProcessor,这些扩展点让开发者有机会在Spring容器实例化Bean前后以及加载配置元数据前后执行自定义逻辑。 整体来看,Spring4中文文档...
- 将选定的文件内容合并到`Properties`对象中,并通过父类的`processProperties`方法加载到Spring容器中。 **5. setGollfPropFiles方法实现** ```java protected void processProperties...
4. **获取Bean**:使用`getBean()`方法从容器中获取Bean实例,进行业务操作。 5. **依赖注入**:容器自动处理Bean之间的依赖关系,无需在代码中显式创建或查找依赖对象。 ### 5. 进阶使用 - **AOP代理**:IoC容器...
在WebSocket支持章节中,文档解释了如何在Spring应用中支持WebSocket,并提供了相关配置和使用场景。 最后,文档还包含了CORS支持、与其他Web框架集成、整合EJB和JMS等高级主题的介绍和示例代码。其中,JMS章节解释...