Ps:因为如果是多例模式的话,它不知道结束的时候该去销毁哪个,所以不会去调用destroy方法。
packagecom.imooc.ioc.demo3; importorg.springframework.beans.BeansException; importorg.springframework.beans.factory.BeanNameAware; importorg.springframework.beans.factory.DisposableBean; importorg.springframework.beans.factory.InitializingBean; importorg.springframework.context.ApplicationContext; importorg.springframework.context.ApplicationContextAware; publicclassManimplementsBeanNameAware,ApplicationContextAware,InitializingBean,DisposableBean{ privateStringname; publicvoidsetName(Stringname) { System.out.println("第二步:设置属性"); this.name=name; } publicMan(){ System.out.println("第一步:初始化..."); } publicvoidsetup(){ System.out.println("第七步:MAN被初始化了..."); } publicvoidteardown(){ System.out.println("第十一步:MAN被销毁了..."); } @OverridepublicvoidsetBeanName(Stringname) { System.out.println("第三步:设置Bean的名称"+name); } @OverridepublicvoidsetApplicationContext(ApplicationContextapplicationContext) throwsBeansException { System.out.println("第四步:了解工厂信息"); } @OverridepublicvoidafterPropertiesSet() throwsException { System.out.println("第六步:属性设置后"); } publicvoidrun(){ System.out.println("第九步:执行业务方法"); } @Overridepublicvoiddestroy() throwsException { System.out.println("第十步:执行Spring的销毁方法"); } }
packagecom.imooc.ioc.demo3; importorg.springframework.beans.BeansException; importorg.springframework.beans.factory.config.BeanPostProcessor; importjava.lang.reflect.InvocationHandler; importjava.lang.reflect.Method; importjava.lang.reflect.Proxy; publicclassMyBeanPostProcessorimplementsBeanPostProcessor { @OverridepublicObjectpostProcessBeforeInitialization(Objectbean, StringbeanName) throwsBeansException { System.out.println("第五步:初始化前方法..."); returnbean; } @OverridepublicObjectpostProcessAfterInitialization(finalObjectbean, StringbeanName) throwsBeansException { System.out.println("第八步:初始化后方法..."); returnbean; } }
<beanid="man"class="com.imooc.ioc.demo3.Man"init-method="setup"destroy-method="teardown"><propertyname="name"value="张三"/></bean><beanclass="com.imooc.ioc.demo3.MyBeanPostProcessor"/>
packagecom.imooc.ioc.demo3; importorg.junit.Test; importorg.springframework.context.ApplicationContext; importorg.springframework.context.support.ClassPathXmlApplicationContext; /*** Bean的作用范围的测试*/publicclassSpringDemo3 { @Testpublicvoiddemo2(){ ClassPathXmlApplicationContextapplicationContext=newClassPathXmlApplicationContext("applicationContext.xml"); Manman= (Man)applicationContext.getBean("man"); man.run(); applicationContext.close(); } }
运行结果:第一步:初始化... 第二步:设置属性第三步:设置Bean的名称man第四步:了解工厂信息第五步:初始化前方法... 第六步:属性设置后第七步:MAN被初始化了... 第八步:初始化后方法... 第九步:执行业务方法第十步:执行Spring的销毁方法第十一步:MAN被销毁了...