spring处理bean
2010-08-25 16:18
274 查看
在这介绍一下spring的BeanPostProcessor类,它可以在初始化bean的前后做些必要的准备,比如一些数据库里的初始化数据等,例子如下(bootstrap.java):
SqlscriptExecutor类:
在spring配置文件中加入:
import javax.sql.DataSource; import org.hibernate.SessionFactory; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.jdbc.core.JdbcTemplate; public class BootStrap implements BeanPostProcessor { private DataSource dataSource; /** * 执行脚本的路径 */ private String sqlpath="存放sql语句的文件夹路径"; //初始化bean之后 public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if (bean instanceof DataSource){ this.dataSource = (DataSource)bean; return bean; } else if (bean instanceof SessionFactory){ //这时DDL已经完成 Boot(); return bean; } else return bean; } //初始化bean之前 public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { return bean; } public void Boot() { JdbcTemplate jt = new JdbcTemplate(this.dataSource); //确定是否第一次启动程序 int cnt = jt.queryForInt("select count(1) from users "); if (cnt!=0) { return; } SqlscriptExecutor sqlexec = new SqlscriptExecutor(dataSource); try { sqlexec.execute(sqlpath); } catch (Exception e) { } } }
SqlscriptExecutor类:
import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.util.ArrayList; import java.util.List; import javax.sql.DataSource; import org.apache.tools.ant.DirectoryScanner; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.util.FileCopyUtils; /** * 读取 SQL 脚本并执行 */ public class SqlscriptExecutor { private DataSource dataSource; public SqlscriptExecutor(DataSource dataSource){ this.dataSource = dataSource; } private String[] findFiles(String sqlpath){ DirectoryScanner ds = new DirectoryScanner(); ds.setIncludes(new String[]{sqlpath+"/*.sql"}); String basedir = this.getClass().getResource("/").getPath(); ds.setBasedir(basedir); ds.setCaseSensitive(true); ds.scan(); String[] files = ds.getIncludedFiles(); return files; } /** * 读取 SQL 文件,获取 SQL 语句 * @param sqlFile SQL 脚本文件 * @return List<sql> 返回所有 SQL 语句的 List * @throws Exception */ private String[] loadSql(String sqlFile) throws Exception { List<String> sqlList = new ArrayList<String>(); sqlFile = "/"+sqlFile.replace('//', '/'); InputStream sqlFileIn = this.getClass().getResourceAsStream(sqlFile); Reader reader = new InputStreamReader(sqlFileIn,"UTF-8"); String sqls = FileCopyUtils.copyToString(reader); String[] sqlArr = sqls.split("(;//s*//r//n)|(;//s*//n)"); return sqlArr; } /** * 传入连接来执行 SQL 脚本文件 * @param conn 传入数据库连接 * @param sqlFile SQL 脚本文件 * @throws Exception */ public void execute(String sqlpath) throws Exception { String[] sqlFiles = findFiles(sqlpath); JdbcTemplate jt = new JdbcTemplate(this.dataSource); for (String sqlFile:sqlFiles){ String[] sqls = loadSql(sqlFile); for (String sql:sqls){ if (sql.endsWith(";")) sql = sql.substring(0,sql.length()-1); try{ jt.update(sql); }catch (Exception e){ } } } } public DataSource getDataSource() { return dataSource; } public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } }
在spring配置文件中加入:
<bean class="所在包.BootStrap"/>
相关文章推荐
- 【Spring】对象后期处理,BeanPostProcessor
- Spring关于使用注解@Configuration去配置FormattingConversionServiceFactoryBean来实现自定义格式字符串处理无效的问题(未找到是什么原因造成的)
- Spring后处理bean使用
- 有关spring中bean的@Scope 和richfaces 中表单分页的处理方式
- Spring 中出现相同名称的 bean 的处理机制
- SPRING IN ACTION 第4版笔记-第三章ADVANCING WIRING-003-@Conditional根据条件生成bean及处理profile
- Spring3.1.0实现原理分析(七).填充Bean属性,初始化Bean,登记善后处理,注册单例Bean
- Spring对注解(Annotation)处理源码分析1——扫描和读取Bean定义
- Spring对注解(Annotation)处理源码分析1——扫描和读取Bean定义
- Spring对注解(Annotation)处理源码分析1——扫描和读取Bean定义
- Spring处理id相同的bean
- spring学习教程7-spring容器创建bean对象的方式以及如何处理多个spring配置文件
- Spring定时任务 Could not find default TaskScheduler bean异常处理
- (转)Spring对注解(Annotation)处理源码分析1——扫描和读取Bean定义
- Spring处理id相同的bean
- spring利用扫描方式对bean的处理(对任何版本如何获取xml配置信息的处理)
- spring后处理bean,BeanPostProcessor
- 关于spring中处理相同id的bean的问题
- Spring对加载的bean之间循环依赖的处理
- spring 装配bean后执行后台进程任务处理线程的处理方式