Spring容器初始化数据(数据库)BeanPostProcessor的应用

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 1、目的:在Spring启动的时候加载在数据库保存的配置信息,一方面杜绝随意修改,一方面方便管理2、BeanPostProcessor是Spring提供的一个方法通过implements方式实现  会产生两个实现类:  @Override public Object postProces...

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分钟刷新静态变量的更新的时候,存在只加载一次,线程没有再启动的问题

  

相关文章
|
5天前
|
存储 关系型数据库 MySQL
如何处理爬取到的数据,例如存储到数据库或文件中?
处理爬取的数据,可存储为txt、csv(适合表格数据)或json(适合结构化数据)文件。若需存储大量数据并执行复杂查询,可选择关系型(如MySQL)或非关系型(如MongoDB)数据库。以MySQL为例,需安装数据库和Python的pymysql库,创建数据库和表,然后编写Python代码进行数据操作。选择存储方式应考虑数据类型、数量及后续处理需求。
13 1
|
6天前
|
SQL 关系型数据库 MySQL
关系型数据库插入数据的语句
使用SQL的`INSERT INTO`语句向关系型数据库的`students`表插入数据。例如,插入一个`id`为1,`name`为&#39;张三&#39;,`age`为20的记录:`INSERT INTO students (id, name, age) VALUES (1, &#39;张三&#39;, 20)。如果`id`自增,则可简化为`INSERT INTO students (name, age) VALUES (&#39;张三&#39;, 20)`。
6 2
|
6天前
|
SQL 存储 Oracle
关系型数据库查询数据的语句
本文介绍了关系型数据库中的基本SQL查询语句,包括选择所有或特定列、带条件查询、排序、分组、过滤分组、表连接、限制记录数及子查询。SQL还支持窗口函数、存储过程等高级功能,是高效管理数据库的关键。建议深入学习SQL及相应数据库系统文档。
8 2
|
11天前
|
数据采集 前端开发 Java
数据塑造:Spring MVC中@ModelAttribute的高级数据预处理技巧
数据塑造:Spring MVC中@ModelAttribute的高级数据预处理技巧
23 3
|
11天前
|
前端开发 Java Spring
数据之桥:深入Spring MVC中传递数据给视图的实用指南
数据之桥:深入Spring MVC中传递数据给视图的实用指南
29 3
|
11天前
|
JSON Kubernetes Go
无缝集成:在IntelliJ IDEA中利用Kubernetes插件轻松管理容器化应用
无缝集成:在IntelliJ IDEA中利用Kubernetes插件轻松管理容器化应用
21 0
无缝集成:在IntelliJ IDEA中利用Kubernetes插件轻松管理容器化应用
|
13天前
|
人工智能 Cloud Native 算法
数据之势丨AI时代,云原生数据库的最新发展趋势与进展
AI与云数据库的深度结合是数据库发展的必然趋势,基于AI能力的加持,云数据库未来可以实现更快速的查询和决策,帮助企业更好地利用海量数据进行业务创新和决策优化。
数据之势丨AI时代,云原生数据库的最新发展趋势与进展
|
20天前
|
存储 安全 Java
Spring Security应用讲解(Java案列演示)
Spring Security应用讲解(Java案列演示)
|
5天前
|
存储 运维 监控
构建高效稳定的Docker容器监控体系
【4月更文挑战第18天】 在现代微服务架构中,Docker容器已成为部署和运行应用的标准环境。随之而来的挑战是如何有效监控这些容器的性能与健康状况,确保系统的稳定性和可靠性。本文将探讨构建一个高效稳定的Docker容器监控体系的关键技术和方法,包括日志管理、性能指标收集以及异常检测机制,旨在为运维人员提供实用的指导和建议。
10 0
|
14天前
|
Linux Docker 容器
docker 容器常用命令
docker 容器常用命令
13 0