java项目部署时自动初始化插入数据库 | 张恒镭的博客

java项目部署时自动初始化插入数据库

时间:14-02-17 栏目:java 作者:恒镭, 张 评论:0 点击: 9,499 次

需求:java工程启动时向数据库中插入若干数据。

 

第一种考虑的实现方式是:用Spring 的init-method方法,

@PostConstruct是Java EE 5引入的注解,Spring允许开发者在受管Bean中使用它。当DI容器实例化当前受管Bean时,@PostConstruct注解的方法会被自动触发,从而完成一些初始化工作,示例代码如下。

  1. @PostConstruct
  2. public void postConstruct(){ 
  3.     log.info("调用postConstruct"); 
  4. }

注意:被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。PreDestroy()方法在destroy()方法执行执行之后执行。

image

代码为:

@PostConstruct

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 事务 总是不提交,原因应该与spring初始化bean顺序有关。所以结果是:启动的时候控制台有打印SQL语句,但是事务没有提交,数据库看不了数据。设置一下(<property name="connection.autocommit">true </property>)
就可以成功啦,但是设置了自动提交,对Spring管理Hibernate 就不好啦。

所以这种方式不被考虑。

 

经过查阅文档

有如下几种方式可以实现。

2、继承 的 BeanPostProcessor 类

Spring的BeanPostProcessor接口,该接口作用是:如果我们需要在Spring容器完成Bean的实例化,配置和其他的初始化后添加一些自己的逻辑处理,我们就可以定义一个或者多个BeanPostProcessor接口的实现。

BeanPostProcessor的作用域是容器级的,它只和所在容器有关。如果你在容器中定义了BeanPostProcessor,它仅仅对此容器中的bean进行后置。它不会对定义在另一个容器中的bean进行任何处理。

参考:http://blog.csdn.net/chensugang/article/details/3423650

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 初始化的时候 这个类的方法都会被调用,而我只想系统启动后只执行一遍,所以这个方法效率不好。

 

3、继承Spring 的 ApplicationListener 这个接口。借助Spring监听接口为数据库初始化数据,代码如下

借助Spring容器是个很好的解决方案。Spring框架提供了事件机制,而事件机制必须实现ApplicationListener监听器,因此我们只要编写一个实现类实现该接口的onApplicationEvent方法,在方法体中检测数据库的初始化数据是否存在并选择初始化之。

步骤:

1、实现ApplicationListener接口

2、交给Spring管理

3、ok!

@Repository//交给Spring管理,如果不是自动扫描加载bean的方式,则在xml里配一个即可
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);
   }
  
}
}
参考:http://howsun.blog.sohu.com/108803269.html

声明: 本文由( 恒镭, 张 )原创编译,转载请保留链接: java项目部署时自动初始化插入数据库

java项目部署时自动初始化插入数据库:等您坐沙发呢!

发表评论




------====== 本站公告 ======------
欢迎关注我的博客。

其他