Spring在容器初始化bean之后(完成依赖注入后)和销毁前都提供了回调的方法,我们称之为生命周期的回调方法。Spring中提供了三种方式来完成生命周期的回调。
第一种是实现Spring中的InitializingBean 和 DisposableBean接口,实现其对应的afterPropertiesSet()方法以及destroy()方法。afterPropertiesSet()方法将会在Spring容器完成属性注入之后进行调用,destroy()将在Spring销毁bean之前进行调用。这种方式有个缺点就是会让你的代码和Spring耦合。
通过使用@PostConstruct 和 @PreDestroy 注解也可以完成相同的功能。这两个注解是由JDK提供的,Spring通过CommonAnnotationBeanPostProcessor 这个后置处理器进行解析和处理。使用方式如下图:
在我们使用xml来进行bean元数据的配置时,我们可以使用init-menthod或者destroy-method属性来指定具体的方法作为我们初始化回调方法。如下体所示:
在一个bean中可以同时按照以上三种方式来指定三个生命周期回调方法。它们执行的顺序是先注解的方式(上面的第二种),接着是接口的方式(上面的第一种),最后是通过xml指定的形式(上面的第三种)。这些生命周期方法是由CommonAnnotationBeanPostProcessor这个后置处理器按顺序进行处理的。
在spring容器初始化完成后,我们也可以指定对应的回调方法来完成我们的业务需有。Spring提供了一个SmartLifecycle 的接口,我们可以通过实现该接口,并将实现类交给Spring进行管理,就可以实现在spring容器初始化完成后去执行我们的业务代码了。SmartLifecycle的接口定义如下 其中SmartLifecycle自身中有三个方法,都有了默认的实现,一般我们不需要实现,其中isAutoStartup()表示是否在Spring容器启动时自动调用start()方法(继承于Lifecycle),stop()为停止时调用的方法。getPhase()方法决定在多个回调方法中该方法的顺序,值越小,越早执行。start()为容器初始化完成后执行的方法。isRunning()用来定义容器是否运行,从而控制stop()方法的调用。