LXY3800 发表于 2015-8-7 11:35:39

[备忘] 如何让一段代码在 tomcat 启动时就被运行?

  理论上来说,要实现 “如何让一段代码在 tomcat 启动时就被运行” 有很多种方法,我所知道的有两种: 1. 在 web.xml 里面配置为 listener ; 2. 配置为 Spring 的 bean 。今天因为有同班同学问了这个问题,所以就总结了这两种方法 o(∩_∩)o

1. 在 web.xml 里面配置为 listener



1
2         com.pandaroid.uniqueonline.UniqueOnlineSessionListener
3
  如上代码片段配置了一个 listener , 该 listener 中有一个 static 代码块:



1 public class UniqueOnlineSessionListener implements HttpSessionListener {
2   static {
3         System.out.println("haha static");
4   }
5   @Override
6   public void sessionCreated(HttpSessionEvent arg0) {
7         
8   }
9
10   @Override
11   public void sessionDestroyed(HttpSessionEvent arg0) {
12         UniqueOnlineRecords.removeUser(arg0.getSession());
13   }
14
15 }
  由于定义为 listener ,所以在 tomcat 启动时就会初始化,初始化时 static 代码块会被执行,于是就达到了我们需要的效果:

  从图中可以看出在 Server 完成启动前,我们的代码就执行了,也就实现了“让一段代码在 tomcat 启动时就被运行”。

2. 配置为 Spring 的 bean
  这种方式在读某学长的代码时看到,于是学了过来。特别要注意的是:使用这种方式时,bean 的 scope 必须设为默认的 singleton 。因为只有这样,Spring 才会在应用服务器启动时为我们加载相应的 bean 。



1
2   
3   
4   
5
  上面是项目中 HiReportService 的配置,为了测试,我在相应的 HiReportServiceImpl 类中加入了一段 static 代码:



1 public class HiReportServiceImpl implements HiReportService {
2   static {
3         System.out.println("Spring bean static !");
4   }
5   ...
6 }
        最终的运行结果如下:

  也是顺利实现了“让一段代码在 tomcat 启动时就被运行”。

3. 总结
  问题的关键在于:让 tomcat 启动时加载我们的类,加载了,那么必然会运行其中的 static 代码块;那么如何让我们的类在 tomcat 启动时被加载?使用上述两种方法即可 o(∩_∩)o
  如果有问题或更好的方法,欢迎留言提出和交流,谢谢 o(∩_∩)o
页: [1]
查看完整版本: [备忘] 如何让一段代码在 tomcat 启动时就被运行?