创建一个Animal的类实现InitializingBean和DisposableBean接口,代码如下:
package io.mykit.spring.plugins.register.bean; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; import org.springframework.stereotype.Component; /** * @author binghe * @version 1.0.0 * @description 测试InitializingBean接口和DisposableBean接口 */ public class Animal implements InitializingBean, DisposableBean { public Animal(){ System.out.println("执行了Animal类的无参数构造方法"); } @Override public void afterPropertiesSet() throws Exception { System.out.println("执行了Animal类的初始化方法。。。。。"); } @Override public void destroy() throws Exception { System.out.println("执行了Animal类的销毁方法。。。。。"); } }接下来,我们新建一个AnimalConfig类,并将Animal通过@Bean注解的方式注册到Spring容器中,如下所示。
package io.mykit.spring.plugins.register.config; import io.mykit.spring.plugins.register.bean.Animal; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; /** * @author binghe * @version 1.0.0 * @description AnimalConfig */ @Configuration @ComponentScan("io.mykit.spring.plugins.register.bean") public class AnimalConfig { @Bean public Animal animal(){ return new Animal(); } }接下来,我们在BeanLifeCircleTest类中新增testBeanLifeCircle02()方法来进行测试,如下所示。
@Test public void testBeanLifeCircle02(){ //创建IOC容器 AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AnimalConfig.class); System.out.println("IOC容器创建完成..."); //关闭IOC容器 context.close(); }运行BeanLifeCircleTest类中的testBeanLifeCircle02()方法,输出的结果信息如下所示。
执行了Animal类的无参数构造方法 执行了Animal类的初始化方法。。。。。 IOC容器创建完成... 执行了Animal类的销毁方法。。。。。从输出的结果信息可以看出:单实例bean下,IOC容器创建完成后,会自动调用bean的初始化方法;而在容器销毁前,会自动调用bean的销毁方法。
多实例bean案例多实例bean的案例代码基本与单实例bean的案例代码相同,只不过在AnimalConfig类中,我们在animal()方法上添加了@Scope("prototype")注解,如下所示。
package io.mykit.spring.plugins.register.config; import io.mykit.spring.plugins.register.bean.Animal; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Scope; /** * @author binghe * @version 1.0.0 * @description AnimalConfig */ @Configuration @ComponentScan("io.mykit.spring.plugins.register.bean") public class AnimalConfig { @Bean @Scope("prototype") public Animal animal(){ return new Animal(); } }接下来,我们在BeanLifeCircleTest类中新增testBeanLifeCircle03()方法来进行测试,如下所示。
@Test public void testBeanLifeCircle03(){ //创建IOC容器 AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AnimalConfig.class); System.out.println("IOC容器创建完成..."); System.out.println("-------"); //调用时创建对象 Object bean = ctx.getBean("animal"); System.out.println("-------"); //调用时创建对象 Object bean1 = ctx.getBean("animal"); System.out.println("-------"); //关闭IOC容器 ctx.close(); }运行BeanLifeCircleTest类中的testBeanLifeCircle03()方法,输出的结果信息如下所示。
IOC容器创建完成... ------- 执行了Animal类的无参数构造方法 执行了Animal类的初始化方法。。。。。 ------- 执行了Animal类的无参数构造方法 执行了Animal类的初始化方法。。。。。 -------从输出的结果信息中可以看出:在多实例bean情况下,Spring不会自动调用bean的销毁方法。
好了,咱们今天就聊到这儿吧!别忘了给个在看和转发,让更多的人看到,一起学习一起进步!!
项目工程源码已经提交到GitHub:https://github.com/sunshinelyz/spring-annotation
写在最后如果觉得文章对你有点帮助,请微信搜索并关注「 冰河技术 」微信公众号,跟冰河学习Spring注解驱动开发。公众号回复“spring注解”关键字,领取Spring注解驱动开发核心知识图,让Spring注解驱动开发不再迷茫。