【问题标题】:How does this code resolve "Resource Leak:'context' is never closed" warning?此代码如何解决“资源泄漏:'context' 永远不会关闭”警告?
【发布时间】:2014-12-21 19:37:00
【问题描述】:

我是 Spring Framework 的新手,在执行以下代码时收到警告“资源泄漏:'context' 永远不会关闭”

package com.programmingtechie.examples;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;

public class Main {

    @SuppressWarnings("deprecation")
    public static void main(String[] args){
        BeanFactory factory = new XmlBeanFactory(new ClassPathResource("beans.xml"));
        User user = (User)factory.getBean("user");
        System.out.println("This Text is using BeanFactory");
        System.out.println("My Name is "+user.getName());
        System.out.println("My Age is "+user.getAge());
        System.out.println("My Height is "+user.getHeight());

        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        User contextUser = (User)context.getBean("user");       
        System.out.println("This Text is using ApplicationContext");
        System.out.println("My Name is "+contextUser.getName());
        System.out.println("My Age is "+contextUser.getAge());
        System.out.println("My Height is "+contextUser.getHeight());

//      ((ConfigurableApplicationContext) context).close();
    }
}

我知道如果我取消注释 ((ConfigurableApplicationContext) context).close(); 行,警告就会得到解决。但我找到了另一种解决警告消息here 的方法,但我不知道这种行为的原因。以下代码如何解决资源泄漏警告?

package com.programmingtechie.examples;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;

public class Main {

    private static ApplicationContext context;
    @SuppressWarnings("deprecation")
    public static void main(String[] args){
        BeanFactory factory = new XmlBeanFactory(new ClassPathResource("beans.xml"));
        User user = (User)factory.getBean("user");
        System.out.println("This Text is using BeanFactory");
        System.out.println("My Name is "+user.getName());
        System.out.println("My Age is "+user.getAge());
        System.out.println("My Height is "+user.getHeight());

        context = new ClassPathXmlApplicationContext("beans.xml");
        User contextUser = (User)context.getBean("user");       
        System.out.println("This Text is using ApplicationContext");
        System.out.println("My Name is "+contextUser.getName());
        System.out.println("My Age is "+contextUser.getAge());
        System.out.println("My Height is "+contextUser.getHeight());

    }
}

【问题讨论】:

    标签: spring memory-leaks applicationcontext


    【解决方案1】:

    在第一种情况下,上下文的范围仅限于 main 方法。因此,该工具假定上下文仅由 main 方法使用,因此应在方法结束时关闭。

    在第二种情况下,您将上下文设为静态变量,这意味着该上下文可用于类中的所有静态方法,而不再局限于 main 方法的范围。所以该工具不能再假定它应该在方法结束时关闭,所以它不再发出警告。

    这并不意味着第二个代码比第一个代码更好,相反。非最终静态变量通常是一种设计气味。而且由于上下文没有理由暴露在 main 方法之外,它不应该是:变量的范围越小越好。

    【讨论】:

    • 谢谢你的解释!! :)
    猜你喜欢
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 2020-07-30
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    相关资源
    最近更新 更多