bean的生命周期:bean的创建 —— 初始化 ——销毁的过程
容器管理bean的生命周期,我们可以自定义初始化和销毁方法,容器在bean进行到当前生命周期就会调用我们的方法
在xml配置文件中是在bean的标签内使用init-method和destroy-method
<bean id="person" class="com.springbean.Person" init-method="" destroy-method="" >
这里我们使用注解的方法
第一种指定初始化和销毁方法
首先创建一个bean
public class Foo { public Foo(){ System.out.println("bean的创建"); } public void init(){ System.out.println("bean的初始化"); } public void destroy(){ System.out.println("bean的销毁"); } }
创建一个配置类:
@Bean注解上指定初始化和销毁方法
@Configuration public class MainBeanConfig {
@Bean(initMethod = "init",destroyMethod = "destroy")public Foo foo(){ return new Foo(); } }
测试:
public class BeanTest { @Test public void test(){ ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainBeanConfig.class); } }
bean如果没有指定作用域,就是单例的,就在容器加载的时候就会创建bean,所以打印的结果是:
bean的创建
bean的初始化
销毁:当容器关闭的时候,就会调用destroy方法,打印 bean的销毁
applicationContext.close();
如果要指定bean的作用域为prototype,就需要在配置类中MainBeanConfig,加上注解@Scope("prototype"),如
@Bean@Scope("prototype")public Foo foo(){ return new Foo();}
指定bean的作用域为@Scope("prototype"),这时候容器加载的时候就不会创建和初始化bean,而是在获取bean的时候。 容器关闭的时候也不会去调用destroy方法,需要自己手动调用。 第二种我们通过bean实现InitializingBean(定义初始化逻辑)和DisposableBean(定义销毁逻辑)创建一个类Hero,实现InitializingBean,DisposableBean接口,加上注解@Component
@Componentpublic class Hero implements InitializingBean,DisposableBean { public Hero(){ System.out.println("创建"); } @Override public void destroy() throws Exception { System.out.println("销毁"); } @Override public void afterPropertiesSet() throws Exception { System.out.println("初始化"); } }
在配置中加上注解ComponentScan去扫描包,也可以使用@Import来将组件加入容器中
如:@Import({Hero.class})
@ComponentScan("com.springbean")public class MainBeanConfig {
测试:
@Test public void test(){ AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainBeanConfig.class); applicationContext.close(); }
打印结果:
创建
初始化
销毁
第三种使用@PostConstruct(构造器创建之后)和@PreDestroy(容器销毁之前)两个注解,这是JSR250的两个注解。
@PostConstruct public void init(){ System.out.println("bean的初始化"); } @PreDestroy public void destroy(){ System.out.println("bean的销毁"); }
原文地址:https://www.cnblogs.com/tdyang/p/11875454.html
时间: 2024-11-10 15:43:18