Spring容器初始化数据(数据库)BeanPostProcessor的应用
1、目的:在Spring启动的时候加载在数据库保存的配置信息,一方面杜绝随意修改,一方面方便管理
2、BeanPostProcessor是Spring提供的一个方法通过implements方式实现
会产生两个实现类:
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
} @Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
名字和返回类型不一样可以自己修改
3、解释:
1)BeanPostProcessor的实现类,是在Spring容器加载所有配置的bean的时候经过(有点类似于拦截器的原理)
2)Object bean:是整个bean加载的时候对应的bean在内存中的地址(可以强转成对应的类型) String beanName:对应的bean的名字(也就是class前面的id名称)
3)postProcessBeforeInitialization方法:是在bean加载之前进行的操作。postProcessAfterInitialization方法:是在bean加载之后进行的操作
4、加载数据的方式就是利用DataSource加载完成之后,连接数据库进行数据加载。(尝试过sessionfactory的方式,但是针对于所有注入接口报错,请大神指点)
具体实现代码仅供参考:
public class PropUtil implements BeanPostProcessor{
public static Map<String, Object> map = new HashMap<String, Object>();
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if("dataSource".equals(beanName)){
DataSource ds = (DataSource)(bean);
Connection conn = null;
PreparedStatement pm = null;
try {
conn = ds.getConnection();
pm = conn.prepareStatement("select * from model");
ResultSet rs = pm.executeQuery();
while(rs.next()){
System.out.println(rs.getString("modelId"));
System.out.print(rs.getString("modelName"));//这里可以针对于不同的数据,保存在对应的map中做静态数据加载,方便其他方法调用
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
conn.close();
pm.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return bean;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
}
5、刷新数据
1)因为数据存在变动的情况,固写入一个刷新机制
2)将对应的操作方式加入到线程里面,这样只需要启动一次服务器,就可以实现数据和配置的更新
6、问题:
1)此方式会对所有bean加载进行一次过滤,在初始化启动的会后会造成相应的效率启动问题
2)我在利用线程实现5分钟刷新静态变量的更新的时候,存在只加载一次,线程没有再启动的问题
Spring容器初始化数据(数据库)BeanPostProcessor的应用的更多相关文章
- spring容器初始化执行某个方法
在做web项目开发中,尤其是企业级应用开发的时候,往往会在工程启动的时候做许多的前置检查. 比如检查是否使用了我们组禁止使用的Mysql的group_concat函数,如果使用了项目就不能启动,并指出 ...
- 当spring 容器初始化完成后执行某个方法
在做web项目开发中,尤其是企业级应用开发的时候,往往会在工程启动的时候做许多的前置检查. 比如检查是否使用了我们组禁止使用的Mysql的group_concat函数,如果使用了项目就不能启动,并指出 ...
- 当spring 容器初始化完成后执行某个方法 防止onApplicationEvent方法被执行两次
在做web项目开发中,尤其是企业级应用开发的时候,往往会在工程启动的时候做许多的前置检查. 比如检查是否使用了我们组禁止使用的Mysql的group_concat函数,如果使用了项目就不能启动,并指出 ...
- spring容器初始化bean和销毁bean之前进行一些操作的定义方法
关于在spring 容器初始化 bean 和销毁前所做的操作定义方式有三种: 第一种,通过在xml中定义init-method和destory-method方法 第二种, ...
- 【Spring实战】Spring容器初始化完成后执行初始化数据方法
一.背景知识及需求 在做WEB项目时,经常在项目第一次启动时利用WEB容器的监听.Servlet加载初始化等切入点为数据库准备数据,这些初始化数据是系统开始运行前必须的数据,例如权限组.系统选项.默认 ...
- Spring容器初始化过程
一.Spring 容器高层视图 Spring 启动时读取应用程序提供的Bean配置信息,并在Spring容器中生成一份相应的Bean配置注册表,然后根据这张注册表实例化Bean,装配号Bean之间的依 ...
- Spring容器初始化的时候如何添加一个定时器?
昨天遇到这个问题,在项目启动的时候添加一个定时器隔一段时间扫描有没有定时发送的邮件(当然也可以是你自己的业务逻辑),也在网上找了资料,加上自己的修改,终于成功了.所以来做个记录. 1.ServletC ...
- ApplicationListener接口,在spring容器初始化后执行的方法
一.如果我们希望在Spring容器将所有的Bean都初始化完成之后,做一些操作,那么就可以使用ApplicationListener接口,实现ApplicationListener接口中的onAppl ...
- Spring 容器初始化方法
Resource resource = new ClassPathResource("/bean.xml"); resource = new FileSystemR ...
随机推荐
- 框架-springmvc源码分析(二)
框架-springmvc源码分析(二) 参考: http://www.cnblogs.com/leftthen/p/5207787.html http://www.cnblogs.com/leftth ...
- NIO概述及实例(时钟服务器)
NIO,非阻塞IO,重点是非阻塞而不是异步! NIO的一般实现如下: package com.pt.nio; import java.net.InetSocketAddress; import jav ...
- YAML(摘录)
YAML:维基百科 一个用来表达数据序列的格式.强调以数据为中心的标记语言. 使用空白符缩进和大量依赖外观的特殊,适合编辑数据结构,配置文件. 基本格式: 缩进/区块 和内置两者格式,来表示array ...
- log4j日志文件配置
### set log levels ### ### debug (打印代码中logger.debug(xx)的信息)> info(打印代码中logger.info(xx)的信息) log4j. ...
- js将 HTML 页面生成 PDF 并下载
最近碰到个需求,需要把当前页面生成 pdf,并下载.弄了几天,自己整理整理,记录下来,我觉得应该会有人需要 :) 先来科普两个插件: html2Canvas 简介 我们可以直接在浏览器端使用html2 ...
- JS中constructor与prototype关系概论
在学习JS的面向对象过程中,一直对constructor与prototype感到很迷惑,看了一些博客与书籍,觉得自己弄明白了,现在记录如下: 我们都知道,在JS中有一个function的东西. ...
- POJ 1961 循环节
和POJ 2406 几乎一样.前者是求 该字符串的最小的循环节.也就是最大的循环次数.后者是求该字符串的每个前缀的循环节的最大循环次数.(如果有的话).而且必须大于1.才可以输出.就是POJ 2406 ...
- Delphi 简体 繁体 转换
http://delphi.ktop.com.tw/board.php?cid=30&fid=69&tid=104986 試看看 這個是豬寶寶從網路上抄來的 檢視純文字版列印? fun ...
- XML——概述
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- 【解决】Android 2.x 不支持overflow、position:fixed解决方案【转】
Android 2.x和IOS5以下都不支持overflow:auto属性(position:fixed也不支持). 移动端浏览器兼容性和PC端相比,有过之而无不及.操作系统版本及各式浏览器和各式的屏 ...