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

  

时间: 2024-11-05 08:15:55

Spring容器初始化数据(数据库)BeanPostProcessor的应用的相关文章

当spring 容器初始化完成后执行某个方法

在做web项目开发中,尤其是企业级应用开发的时候,往往会在工程启动的时候做许多的前置检查. 比如检查是否使用了我们组禁止使用的Mysql的group_concat函数,如果使用了项目就不能启动,并指出哪个文件的xml文件使用了这个函数. 而在Spring的web项目中,我们可以介入Spring的启动过程.我们希望在Spring容器将所有的Bean都初始化完成之后,做一些操作,这个时候我们就可以实现一个接口: package com.yk.test.executor.processor publi

Servlet初始化相关问题,以及Spring容器初始化

一.Servlet初始化 ①Servlet在初始化的时候,是通过init(ServletConfig config) 或 init() 来执行的. ServletConfig 是一个接口,它怎样传递给他一格对象来进行初始化呢?其实,是这个对象是由 servlet 容器来实例化的,由容器产生一格 ServletConfig 的实现类的对象,然后传递给 Servlet ②我们有些时候可能在 Servlet 初始化时给它一些固定的配置参数,那么这些参数是怎样传递到 Servlet 呢?其实,我们在 w

Spring容器初始化过程

一.Spring 容器高层视图 Spring 启动时读取应用程序提供的Bean配置信息,并在Spring容器中生成一份相应的Bean配置注册表,然后根据这张注册表实例化Bean,装配号Bean之间的依赖关系,为上层应用提供准备就绪的运行环境. 二.内部工作机制 该图描述了Spring容器从加载配置文件到创建出一个完整Bean的作业流程: 1.ResourceLoader从存储介质中加载Spring配置信息,并使用Resource表示这个配置文件的资源: 2.BeanDefinitionReade

Spring容器初始化

问:Spring容器.SpringIOC是什么? 那么Spring容器到底是什么东西呢,长什么样子呢?为什么感觉像是哆啦A梦的百宝箱,什么东西都能拿出来? 所以本文针对以上问题对一个简单的说明, 1.首先我们整个过程中要保持一个概念,容器中的Bean要经历以下步骤带着这个思想去看就会好理解一些: 2.来个简单的例子 ??:XML方式定义Bean <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=

Spring容器初始化后执行的方法

在项目中, 会遇到要在容器加载完就做一些初始化, 例如Quartz的监听器重新注册(Quartz监听器在RAM中的, Web容器重启或关闭会丢失)等需求. <span style="font-family:Microsoft YaHei;font-size:18px;">import org.springframework.context.ApplicationListener; import org.springframework.context.event.Contex

spring 容器初始化 bean 和销毁前所做的操作

第一种:通过注解@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作 [java] view plain copy import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; public class DataInitializer{ @PostConstruct public void initMethod() throws Exception { Sys

当springMVC 容器初始化完成后执行某个方法

分类: spring java2013-06-19 16:40 8289人阅读 评论(4) 收藏 举报 在某些应用中,我们希望,当spring 容器将所有的bean都初始化完成后,做一个操作(例如:将数据库中的字典,加载到内存中),这时我们可以实现一个接口,如下: [java] view plaincopyprint? package com.yk.test.executor.processor public class InstantiationTracingBeanPostProcessor

spring容器加载完成执行某个方法

今天遇到一个问题,需要在项目中加入一个定时器,需要在项目启动后就执行,所以就在网上找spring容器初始化之后就执行的方法有什么: 查了很多资料,总共找到了两个符合条件的方法,都是用了一下之后,结合网上的信息说说我个人的理解: 1.写一个类,实现BeanPostProcessor,这个接口有两个方法: (1)postProcessBeforeInitialization方法,在spring中定义的bean初始化前调用这个方法: (2)postProcessAfterInitialization方

springmvc web.xml配置之SpringMVC IOC容器初始化

SpringMVC IOC容器初始化 首先强调一下SpringMVC IOC容器初始化有些特别,在SpringMVC中除了生成一个全局的spring Ioc容器外,还会为DispatcherServlet生成一个容器,具体的下一篇有讲述. 我们知道spring中单纯使用main函数就可以生成一个容器,如下: public class MainTest { public static void main(String[] args){ ApplicationContext appContext =