【问题标题】:When does bean's destroy-method will be called in spring?spring什么时候调用bean的destroy-method?
【发布时间】:2015-03-02 11:02:48
【问题描述】:

这是用于存储特定用户详细信息的 bean 类。它有两个方法名为init和destroy。需要在bean初始化和销毁​​时调用。

package org.springframework.HelloWorld.beans;

public class User {
    private int userId;
    private String userName;
    private String address;
    private String mobileNumber;

    public User() {
        super();
    }

    public User(int userId, String userName, String address, String mobileNumber) {
        super();
        this.userId = userId;
        this.userName = userName;
        this.address = address;
        this.mobileNumber = mobileNumber;
    }

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getMobileNumber() {
        return mobileNumber;
    }

    public void setMobileNumber(String mobileNumber) {
        this.mobileNumber = mobileNumber;
    }

    @Override
    public String toString() {
        return "User [userId=" + userId + ", userName=" + userName
                + ", address=" + address + ", mobileNumber=" + mobileNumber
                + "]";
    }

    public void init(){
        System.out.println("Initialized");
    }

    public void destroy(){
        System.out.println("Destroyed");
    }
}

这是我使用的主要方法。这里我从 Beans.xml 文件中获取 User 对象。

public static void main(String[] args) {
        @SuppressWarnings("resource")
        ApplicationContext ctx = new ClassPathXmlApplicationContext("Beans.xml");
        User user = (User) ctx.getBean("user");
        System.out.println(user);
        user.setUserName("Gnanadurai Asudoss");
        user.setAddress("Chxxxxx");
        System.out.println(user);
        user = (User) ctx.getBean("user");
        System.out.println(user);
        user=null;
    }

下面是 Beans.xml 文件,这里我提到了 bean、init 方法和 destroy 方法。

<bean id="user" class="org.springframework.HelloWorld.beans.User" init-method="init" destroy-method="destroy">
		<property name="userId" value="1"></property>
		<property name="userName" value="Gnanadurai"></property>
		<property name="address" value="Saxxxx"></property>
		<property name="mobileNumber" value="xxxxxxxx49"></property>
	</bean>

这是我得到的输出。在这里你可以看到 Initialized 方法正在被调用,而 Destroy 方法没有被调用。

Initialized
User [userId=1, userName=Gnanadurai, address=Saxxx, mobileNumber=xxxxxxxx49]
User [userId=1, userName=Gnanadurai Asudoss, address=Chxxxx, mobileNumber=xxxxxxxx49]
User [userId=17505, userName=Gnanadurai Asudoss, address=Chxxxx, mobileNumber=xxxxxxxx49]

所以我不知道什么时候会调用destroy方法。你能告诉我什么时候调用它吗?给我一个例子。

谢谢...

【问题讨论】:

    标签: java spring


    【解决方案1】:

    根据这篇文章你需要close你的applicationContext,在这个动作之后你的destroy会被调用。 Related SO question

    //Getting application context
    ApplicationContext context = new ClassPathXmlApplicationContext(beansXML); 
    
    //cleaning context
    ((ClassPathXmlApplicationContext) context).close(); 
    

    【讨论】:

      【解决方案2】:

      您需要在 JVM 上为应用程序上下文注册关闭或关闭应用程序上下文。您可以为此目的使用close()registerShutdownHook() 方法,如下所示。有关详细信息,请参阅 Javadoc here

      ctx.close();
      ctx.registerShutdownHook();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-18
        • 1970-01-01
        • 2012-05-22
        • 2013-09-17
        • 2019-12-25
        • 2011-05-26
        • 2013-08-23
        相关资源
        最近更新 更多