ServletContextListener 和静态块

Posted

技术标签:

【中文标题】ServletContextListener 和静态块【英文标题】:ServletContextListener and static block 【发布时间】:2020-11-30 14:08:02 【问题描述】:

我在下面的类中创建了 ServletContextListener。我还在同一个包的另一个类中创建了静态块。它将首先在 servlet 类型的应用程序中运行。那个静态块根本没有运行。

@WebListener
public class BaclkgroundJobManager implements ServletContextListener 

     private ScheduledExecutorService scheduler;

    public void contextInitialized(ServletContextEvent sce)   

        System.err.println("inside context initialized");
        scheduler=Executors.newSingleThreadScheduledExecutor();
        scheduler.scheduleAtFixedRate(new SomeHourlyJob(), 0, 2, TimeUnit.MINUTES);      
    
    
    

下面是包含static 块的类。

public class ConnectionUtil 
    
    public static String baseUrl,tokenUrl,grantType,scope,user,password,skillName, accessToken,filePath;
    
    static
    
       try 
        ClassLoader classLoader= Thread.currentThread().getContextClassLoader();
        InputStream input =classLoader.getResourceAsStream("com/dynamicentity/properties/application.properties");
        Properties properties =new Properties();
        properties.load(input);
        System.out.println("Inside the static block of ConnectionUtil class");
        skillName=properties.getProperty("chatbot.skillName");
        baseUrl=properties.getProperty("chatbot.baseUrl");
    
       
       catch(Exception e)
       
           System.out.println(e.getMessage());
       
        
    

在整个应用程序中只有这个类有静态块。这个静态块会在我启动服务器后立即执行吗?还是我必须以某种方式运行它?

【问题讨论】:

【参考方案1】:

类初始化块static ... 作为类加载过程的一部分运行。通常,类在需要时按需加载。如果您的代码中没有任何内容使用 ConnectionUtil 类,则它永远不会加载,并且初始化程序块永远不会运行。

向 ConnectionUtil 添加一个静态方法并从 BaclkgroundJobManager 调用它。该方法不需要做任何事情,但是拥有它可以确保类被加载。

另一种可能性是使用反射 API 加载类

Class.forName("your.package.name.ConnectionUtil");

【讨论】:

有些人反对这个问题,在这里你回答并解决了我的问题。非常感谢乔尼。

以上是关于ServletContextListener 和静态块的主要内容,如果未能解决你的问题,请参考以下文章

ServletContextListener接口用法

JavaWeb-ServletContextListener

ServletContextListener 和静态块

ServletContextListener

ServletContextListener在Springboot中的使用

ServletContextListener使用详解