您的位置:首页 > 编程语言 > Java开发

spring处理bean

2010-08-25 16:18 274 查看
在这介绍一下spring的BeanPostProcessor类,它可以在初始化bean的前后做些必要的准备,比如一些数据库里的初始化数据等,例子如下(bootstrap.java):

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"/>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: