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

      

  • 相关阅读:
    纯css3实现的超炫checkbox复选框和radio单选框
    css3和jquery实现的可折叠导航菜单(适合手机网页)
    HTML5 Canvas 梦幻的文字飞扬动画教程
    纯css3实现的圆形旋转分享按钮
    纯css3实现的创意图片放大镜
    java.lang.ClassCastException: android.widget.RelativeLayout cannot be cast to android.widget.TextView
    python的range函数与切片操作符
    python简单基础代码
    android笔记 : Content provider内容提供器
    android笔记:Service
  • 原文地址:https://www.cnblogs.com/ll409546297/p/6433420.html
Copyright © 2020-2023  润新知