web项目启动时执行方法的实现方式

web项目启动的时执行方法,实现有好多种,可以分为2大类:

1.使用web自带的:

(1)使用servlet,但是他不能使用spring 的bean 还需要手动获取,比较麻烦.

(2)创建一个类实现ServletContextListener 接口,实现里面的contextInitialized和contextDestroyed方法

package com.test. listener;
 
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
//创建的类名根据需要定义,但一定要实现ServletContextListener接口
public class WebContextListener implements ServletContextListener {
 
    
    @Override
    public void contextInitialized(ServletContextEvent arg0) {
        // TODO Auto-generated method stub
        //这里可以放你要执行的代码或方法    
    }
    
    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        // TODO Auto-generated method stub
        
    }
 
    
}

其中contextInitialized方法是项目在启动初始化的时候就会执行的方法,contextDestroyed是在消亡的时候执行的方法,这里我们需要把随项目启动时执行的代码放在contextInitialized方法中。

         然后在web.xml中为这个监听器添加配置,

  <listener>
    <listener-class> com.test. listener.WebContextListener</listener-class>
  </listener>
其中listenner-class配置的是上面定义的监听器类路径

         这样就就可以了,部署好项目,启动就可以执行contextInitialized里面的代码了。
 

2.使用spring框架的话,实现比较多

(1)方法上加注解@PostConstruct

@Compant
public class InitDemo{

    @PostConstruct
    public void init(){
        //项目启动就会执行这个方法
        doSomething();
    }
}

(2).xml配置init-method

我在spring的配置文件中添加上这条,这个配置只能在启动项目是执行一遍。 
还有一点 要注意 这个方法不能是controller层的方法

<-- class是类的全名加包名 这是指定运行的方法在那个类里面   -->
<-- scope 值得范围 这里给的参数是 singleton   -->
<-- inti-method 是指要执行的方法  -->

<bean id="InitDemo" class="com.xxx.InitDemo" scope="singleton" init-method="init">
</bean>

(3).实现InitializingBean接口,重写afterPropertiesSet方法
@Component
public class InitDemo implements InitializingBean {

    @Override
    public void afterPropertiesSet() throws Exception {

       //doSomeThing
    }
(4)实现ApplicationListener的listener类

@Service
public class StartupListener implements
           ApplicationListener<ContextRefreshedEvent > {

      public static String ShopNum ;
      @Autowired
      ShopService shopService;

      @Override
      public void onApplicationEvent(ContextRefreshedEvent event) {

           if ( event.getApplicationContext (). getParent() == null) {
               // TODO 这里写下将要初始化的内容
               Shop shopByShopNum = shopService
                         .getShopByShopNum ("e7-80-2e-e8-6c-a6" );
                System.out .println ("----------------------------" );
           } }}
(5)CommandLineRunner接口

使用CommandLineRunner接口类似于Main方法启动,可以接受一个字符串数组的命令行参数,来看一下实现
@Component
public class MyCommandLineRunner implements CommandLineRunner{

    @Override
    public void run(String... args) throws Exception{
        //假装有代码
    }
}

(6)ApplicationRunner 接口
此种方式与实现CommandLineRunner接口的区别就是他的参数是ApplicationArguments
@Order(value = 1)
@Component
public class MyApplicationRunner implements ApplicationRunner{

    @Override
    public void run(ApplicationArguments args) throws Exception{
        //假装有代码
    }
}
我们可以看到,此类相比较于第二种方式还增加一个@Order注解,这个注解其实第二种方式也是能加的。

它的作用就是控制类的加载顺序,这个顺序是从小到大的。比如说启动时先去加载Order的value等于1的类,然后去加载等于2的类。
 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Go Web 项目中,可以使用中间件的方式实现过滤器的功能,下面是一个简单的示例代码: ```go package main import ( "fmt" "net/http" ) // 过滤器中间件 func filterMiddleware(next http.HandlerFunc) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { // 进行过滤操作,例如检查用户登录状态等 fmt.Println("过滤器中间件执行") // 调用下一个处理函数 next(w, r) } } // 处理函数 func handlerFunc(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello, World!") } func main() { // 注册路由和中间件 http.HandleFunc("/", filterMiddleware(handlerFunc)) // 启动服务 http.ListenAndServe(":8080", nil) } ``` 在上面的代码中,`filterMiddleware` 函数是一个过滤器中间件,它接受一个 `http.HandlerFunc` 型的处理函数作为参数,返回一个新的 `http.HandlerFunc` 型的函数。在这个函数中,我们可以执行过滤器操作,例如检查用户登录状态等,然后调用下一个处理函数。 在 `main` 函数中,我们注册了一个路由和中间件,使用 `http.HandleFunc` 函数来指定路由和处理函数。在这个例子中,我们只有一个路由,即根路径 `/`,并且使用 `filterMiddleware` 中间件来进行过滤操作。最后,我们调用 `http.ListenAndServe` 函数来启动服务器。 当客户端发送请求时,服务器会先执行中间件函数 `filterMiddleware`,然后再执行处理函数 `handlerFunc`。这样就可以实现过滤器的功能了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值