项目部署时自动初始化数据库的方法

本文探讨了三种在项目启动时向数据库插入数据的方法:通过BeanPostProcessor、init-method及ApplicationListener实现。每种方法均有其优缺点,如效率、事务管理等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天有一个需求,就是在项目启动的时候向数据库里面插入一条数据。
第一种:继承 Spring 的 BeanPostProcessor 类,代码如下

public class BeanPostPrcessorImpl implements BeanPostProcessor {
private ICompanyService companyService;
public ICompanyService getCompanyService() {
   return companyService;
}

public void setCompanyService(ICompanyService companyService) {
   this.companyService = companyService;
}

// Bean 实例化之前进行的处理
public Object postProcessBeforeInitialization(Object bean, String beanName)
    throws BeansException {
   System.out.println("对象" + beanName + "开始实例化");
   return bean;
}

// Bean 实例化之后进行的处理
public Object postProcessAfterInitialization(Object bean, String beanName)
    throws BeansException {
   System.out.println("对象" + beanName + "实例化完成");
   List<User> list = companyService.findAll("from User");
   if (list.size() <= 0) {
    User user = new User();
    user.setName("ahhffl");
    user.setPassword("ahhffl");
    companyService.addObject(user);
   }
   return bean;
}
}

但是每个bean 初始化的时候 这个类的方法都会被调用,而我只想插入一条数据,所以效率不好。

参考:http://blog.youkuaiyun.com/chensugang/archive/2008/12/01/3423650.aspx

第二种:想起可以用Spring 的init-method 这种方式,他可以再bean 实例化之后 初始化一个指定的方法,
但是这个方法必须无参,没有返回值的。代码如下:

public void init() throws Exception { 
        System.out.println("JavaBean类init 方法"); 
        List<User> list = basicDao.findAll("from User");
   if(list.size() <= 0){
    User user = new User();
    user.setName("ahhffl");
    user.setPassword("ahhffl");
    basicDao.saveUser(user);
    System.out.println(user.getName());
    System.out.println(user.getPassword());
    System.out.println(user.getId());
   } 
    }

但是这种hibernate 事务 总是不提交,所以结果是:启动的时候控制台有打印SQL语句,但是事务没有提交,数据库看不了数据。设置一下(<property name="connection.autocommit">true </property>)
就可以成功啦,但是设置了自动提交,对Spring管理Hibernate 就不好啦。

第三种:继承Spring 的 ApplicationListener 这个接口。借助Spring监听接口为数据库初始化数据,代码如下:
public class ApplicationListenerImpl implements ApplicationListener {
private ICompanyService companyService;
    public ICompanyService getCompanyService() {
   return companyService;
}

public void setCompanyService(ICompanyService companyService) {
   this.companyService = companyService;
}

@Override
public void onApplicationEvent(ApplicationEvent arg0) {
   List<User> list = companyService.findAll("from User");
   if(list.size() <= 0){
    User user = new User();
    user.setName("ahhffl");
    user.setPassword("ahhffl");
    companyService.addObject(user);
   }
  
}
}


转载地址

点击打开链接


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值