如何在Spring中将shutdownHook配置为运行时

如何在Spring中将shutdownHook配置为运行时,spring,Spring,我正在研究bean生命周期,我正在使用回调接口:“InitializingBean”和“DisposableBean”来实现生命周期方法,除此之外,在我的主类中,我尝试向 运行时对象,这样我就不需要调用 ((ConfigurableListableBeanFactory)工厂) 手动。在这里,我创建了一个类ShutdownHook作为 public class ShutDownHook implements Runnable, BeanFactoryAware { pr

我正在研究bean生命周期,我正在使用回调接口:“InitializingBean”和“DisposableBean”来实现生命周期方法,除此之外,在我的主类中,我尝试向 运行时对象,这样我就不需要调用

((ConfigurableListableBeanFactory)工厂)

手动。在这里,我创建了一个类ShutdownHook作为

    public class ShutDownHook implements Runnable, BeanFactoryAware {

        private BeanFactory factory;

        @Override
        public void setBeanFactory(BeanFactory factory) throws BeansException {
            System.out.println("performing aware injection");
            this.factory = factory;
        }

        @Override
        public void run() {
            ((ConfigurableListableBeanFactory) factory).destroySingletons();  -----> X
        }

    }
我的主要课程是

public static void main(String[] args) {
    BeanFactory factory = new XmlBeanFactory(new ClassPathResource("com/bli/common/application-context.xml"));
    Math math = factory.getBean("math", Math.class);


    ShutDownHook shutDownHook = factory.getBean("shutdownhook", ShutDownHook.class);
    Runtime runtime = Runtime.getRuntime();
    runtime.addShutdownHook(new Thread(new ShutDownHook()));

}
下面是我想要在其上执行初始化和销毁的Bean

public class Math implements InitializingBean, DisposableBean {


@Override
public void destroy() throws Exception {
    System.out.println("destroyed....");
}

@Override
public void afterPropertiesSet() throws Exception {
    System.out.println("performed initialization ...");
}
我已经在SpringBean配置文件中将所需的bean配置为

<bean id="math" class="com.bli.beans.Math">
    <constructor-arg value="10"></constructor-arg>
    <property name="y" value="20"></property>
</bean>

<bean id="shutdownhook" class="com.bli.beans.ShutDownHook"></bean>
也就是说,当控制器进入shutdownHook类的run方法时,对工厂的引用丢失了。。我不知道为什么
第(x)行出现异常,我在上面的代码中标记了该异常。您可以在主方法中用单个调用替换上述所有逻辑:

context.registerShutdownHook();
请注意,您需要使用从
AbstractApplicationContext
派生的实例,而不是
BeanFactory
,但这很容易实现(即创建
GenericXmlApplicationContext
的实例)


有关方法的信息,请参见编辑您的主要方法,如下所示,您的NullPointerException问题将得到解决:)

 ShutDownHook shutDownHook = factory.getBean("shutdownhook", ShutDownHook.class);
Runtime runtime = Runtime.getRuntime();
runtime.addShutdownHook(new Thread(shutDownHook));
 ShutDownHook shutDownHook = factory.getBean("shutdownhook", ShutDownHook.class);
Runtime runtime = Runtime.getRuntime();
runtime.addShutdownHook(new Thread(shutDownHook));