开发者社区> 小不点丶> 正文

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

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

  

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【Spring原理探索】深入认识对象生命周期之BeanPostProcessor
【Spring原理探索】深入认识对象生命周期之BeanPostProcessor
33 0
Spring官网阅读(八)容器的扩展点(三)(BeanPostProcessor)
Spring官网阅读(八)容器的扩展点(三)(BeanPostProcessor)
45 0
Spring 源码阅读 14:注册 BeanPostProcessor
本文主要分析了 Spring 上下文初始化过程中,注册 BeanPostProcessor 的逻辑。
38 0
Spring系列(八):Spring生命周期中BeanPostProcessor接口用法介绍
BeanPostProcessor接口通常被称为Bean的后置处理器,它是Spring中定义的接口,可以在Spring容器的创建过程中(主要在Bean初始化前后进行工作)回调BeanPostProcessor中定义的两个方法。
40 0
Spring之BeanFactoryPostProcessor和BeanPostProcessor
Spring之BeanFactoryPostProcessor和BeanPostProcessor
99 0
Spring - Bean管理之生命周期之BeanPostProcessor
Spring - Bean管理之生命周期之BeanPostProcessor
48 0
spring源码系列7:Spring中的InstantiationAwareBeanPostProcessor和BeanPostProcessor的区别
spring源码系列7:Spring中的InstantiationAwareBeanPostProcessor和BeanPostProcessor的区别
59 0
使用Spring的BeanPostProcessor优雅的实现工厂模式
使用Spring的BeanPostProcessor优雅的实现工厂模式
113 0
深入理解 Spring BeanPostProcessor
回顾上一篇博客中,在AbstractApplicationContext这个抽象类中,Spring使用invokeBeanFactoryPostProcessors(beanFactory);执行BeanFactoryPostProcessor,通过回调Spring自己添加的ConfigurationClassPostProcessor以及用户添加的bean工厂的后置处理器,完成了包扫描以及对主配置类代理的工作 本篇博文将继续往下跟进
33 0
【小家Spring】注意BeanPostProcessor启动时对依赖Bean的“误伤”陷阱(is not eligible for getting processed by all...)(下)
【小家Spring】注意BeanPostProcessor启动时对依赖Bean的“误伤”陷阱(is not eligible for getting processed by all...)(下)
426 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
电商网站需求分析和架构设计Spring Boot2.6入门
立即下载
云上Docker的Spring Cloud微服务应用实践分享
立即下载
Spring Boot 2.6.0电商网站开发实战
立即下载