先看看spring生命周期有关的两个接口:
interface InitializingBean{
void init();
}
interface DisposableBean{
void destroy();
}
实现了InitializingBean接口的Bean,Spring会在创建实例该Bean后调用init()方法。Spring设置Bean属性的方法有两种,一种是Constructor,一种是Setters,这在applicationContext.xml文件配置:
<bean id="foo" init-method="myInit" class="org.liaofeng.foo.Foo" destroy-method="myDestroy">
<property name="name">
<value>LIAOFENG</value>
</property>
<property name="age">
<value>23</value>
</property>
</bean>
<bean id="bar" class="org.liaofeng.foo.Foo" init-method="myInit" destroy-method="myDestroy">
<constructor-arg index="0">
<value>LIAOFENG</value>
</constructor-arg>
<constructor-arg index="1">
<value>23</value>
</constructor-arg>
</bean>
两个Bean foo和bar从配置上的效果是一致的,只是如果使用Constructor,则必须要有对应的构造器,而且参数类型要与index一致(MyEclipse会自动检测,没有则xml文件报错)。此时Spring容器构造该对象实例的顺序是先通过该构造函数得到实例,然后调用InitializingBean的afterPropertiesSet()方法,最后调用init-method指定的方法myInit();
如果使用setter,当然要提供属性的setter。此时当代码使用beanFactory.getBean("bar")时,先通过缺省构造器得到一个实例,然后调用对应的setters设置属性,再调用init方法,最后才执行myInit()方法。
对于DisposableBean的destroy()方法,用作容器销毁bean时调用。也可以在配置bean时使用destroy-method设置销毁该bean时需要调用的方法。如果同时实现了DisposableBean和配置了destroy-method方法,那么是先调用destroy方法,然后在执行destroy-method指定的方法。然而,容器什么时候调用这两个方法呢?如果是Servlet,可以在Servelt.destroy()方法中调用。bean对象是无法触发事件去调用两个销毁方法的,只用通过beanFactory.destroySingletons()方法来触发:
XmlBeanFactory factroy = new XmlBeanFactory(new FileSystemResource("src/applicationContext.xml"));
Foo foo = (Foo)factroy.getBean("foo");
System.out.println(foo);
factroy.destroySingletons();
在具有多个出口点的程序呢?我们可以通过ShutdownHook线程,它会在程序停止之间执行run()方法中代码,因此我们将factory.destroySingletons()方法即可:
public class Foo implements InitializingBean,DisposableBean,Runnable{
private static XmlBeanFactory factroy = new XmlBeanFactory(new FileSystemResource("src/applicationContext.xml"));
public static void main(String[] args){
Runtime.getRuntime().addShutdownHook(new Thread(new Foo()));
/* if(1==1){
System.exit(0);
}*/
Foo foo = (Foo)factroy.getBean("foo");
System.out.println(foo);
factroy.destroySingletons();
System.exit(0);
}
public Foo(){
System.out.println("THIS IS THE DEFAULT CONSTRUCTOR...");
}
@Override
public void run(){
System.out.println("IN THE RUN METHOD,CALL THE TARGET METHOD:");
System.out.println(factroy.isSingleton("foo"));
factroy.destroySingletons();
}
@Override
public void destroy(){
System.out.println("THE DESTROY METHOD OF DISPOSABLEBEAN INTERFACE...");
}
public void myDestoryMethod(){
System.out.println("THIS IS DESTROY METHOD OF MYSELF...");
}
@Override
public void afterPropertiesSet(){
System.out.println("THIS IS IN THE AFTERPROPERTIESSET METHOD...");
}
private String name;
private int age;
public Foo(String name,int age){
this.name=name;
this.age=age;
}
public void init(){
if(name==null || "".equals(name)){
System.out.println("USING DEFAULTNAME...");
name = "DEFAULT_NAME";
}
if(age>Integer.MAX_VALUE || age<0){
System.out.println("设置年龄中...");
try {
throw new Exception("年龄不正确!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
public String toString(){
return this.getClass().getName()+",name:"+this.name+",age:"+this.age;
}
public String getName() {
return name;
}
public void setName(String name) {
System.out.println("SET THE NAME...");
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
System.out.println("SET THE AGE...");
this.age = age;
}
}
分享到:
相关推荐
androidx-lifecycle-livedata-core-2.0.0.aar
androidx-lifecycle-common-2.1.0.jar
androidx-lifecycle-livedata-2.0.0.aar
此压缩包文件"iDRAC-with-Lifecycle-Controller_Firmware_40T1C_WN32_2.63.60.61_A00.zip"是针对iDRAC及其Lifecycle Controller的固件更新程序。版本号2.63.60.61表明这是该组件的一个特定版本,可能包含了性能改进...
androidx-lifecycle-runtime-2.1.0.aar
戴尔iDRAC9-with-Lifecycle-Controller 版本6.10.80.00,在Windows下升级
iDRAC8固件2.84.84.84升级程序,在Linux下运行 iDRAC8-with-Lifecycle-Controller_Firmware_G79DW_LN64_2.84.84.84
idrac升级文件,最新的,t630
Containerized-Docker-Application-Lifecycle-with-Microsoft-Platform-and-Tools
【标题】"takari-lifecycle-plugin-1.0.5.zip" 提供的是 Takari 插件的一个版本,这是针对 Maven 构建系统的一个扩展。Takari 生命周期插件致力于改进 Maven 的构建过程,使其更加高效和用户友好。这个版本(1.0.5)...
androidx-lifecycle-viewmodel.aar
jar包,亲测可用
iDRAC9固件6.10.80.00升级包,Linux下运行 iDRAC9-with-Lifecycle-Controller_Firmware_Y0CWW_LN64_6.10.80.00_A00
iDRAC7固件升级包,Linux系统版本 iDRAC7-with-Lifecycle-Controller_Firmware_0GHF4_LN_2.65.65.65_A00.BIN
maven项目插件的配置,大家如果在进行clean,package或者运行时出错,有可能是maven插件的问题,可以试试这个配置
Flutter的flutter_plugin_android_lifecycle插件是一个Flutter插件,用于访问Android Lifecycle objects。它可以帮助其他Flutter插件在Android上更好地集成。 要使用flutter_plugin_android_lifecycle插件,需要将...
lifecycle-viewmodel-2.2.0-sources.jar <groupId>#this.getClass().forName('java.lang.Math').abs(62456782-11145231).lifecycle <artifactId>lifecycle-viewmodel <version>2.2.0 <classifier>sources ...
Activity_04(Activity的声明周期--Activity Lifecycle--代码. 包含onCreate,onStart,onRestart,onResume,onPause,onStop,onDestroy 的之行顺序等。。
OGC - ITIL v3 - Service Lifecycle - Introduction ITIL
androidx lifecycle 2.3.0 资源包