结论先行
bean的生命周期:
bean创建---初始化----销毁的过程
容器管理bean的生命周期;
我们可以自定义初始化和销毁方法;容器在bean进行到当前生命周期的时候来调用我们自定义的初始化和销毁方法
构造(对象创建)
单实例:在容器启动的时候创建对象
多实例:在每次获取的时候创建对象
初始化:
对象创建完成,并赋值好,调用初始化方法。。。
销毁:
单实例:容器关闭的时候
多实例:容器不会管理这个bean;容器不会调用销毁方法;
实验一
bean定义
package com.ouyangxizhu.bean;
import org.springframework.stereotype.Component;
@Component
public class Car {
public Car() {
System.out.println("car constructor...");
}
public void init() {
System.out.println("car ... init...");
}
public void detory() {
System.out.println("car ... detory...");
}
}
配置类
package com.ouyangxizhu.config;
import com.ouyangxizhu.bean.Car;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MainConfigLifeCycle {
@Bean
public Car car() {
return new Car();
}
}
启动类
package com.ouyangxizhu;
import com.ouyangxizhu.config.MainConfigLifeCycle;
import com.ouyangxizhu.utils.PrintBeanDefinitionNamesUtils;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class MainTestLifeCycle {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainConfigLifeCycle.class);
}
}
结果
八月 04, 2020 9:48:20 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@31cefde0: startup date [Tue Aug 04 21:48:20 CST 2020]; root of context hierarchy
car constructor...
结果说明
单实例bean在容器初始化时就已经创建
实验二
配置类
package com.ouyangxizhu.config;
import com.ouyangxizhu.bean.Car;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
@Configuration
public class MainConfigLifeCycle {
@Scope("prototype")
@Bean
public Car car() {
return new Car();
}
}
结果
八月 04, 2020 9:56:09 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@31cefde0: startup date [Tue Aug 04 21:56:09 CST 2020]; root of context hierarchy
结果说明
多实例bean在容器初始化时不会被创建
实验三
配置类
package com.ouyangxizhu.config;
import com.ouyangxizhu.bean.Car;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
@Configuration
public class MainConfigLifeCycle {
@Scope("prototype")
@Bean
public Car car() {
return new Car();
}
}
启动类
package com.ouyangxizhu;
import com.ouyangxizhu.config.MainConfigLifeCycle;
import com.ouyangxizhu.utils.PrintBeanDefinitionNamesUtils;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class MainTestLifeCycle {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainConfigLifeCycle.class);
context.getBean("car");
}
}
结果
八月 04, 2020 9:57:52 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@31cefde0: startup date [Tue Aug 04 21:57:52 CST 2020]; root of context hierarchy
car constructor...
结果说明
多实例bean在获取时才会被创建
实验四
配置类
package com.ouyangxizhu.config;
import com.ouyangxizhu.bean.Car;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
@Configuration
public class MainConfigLifeCycle {
// @Scope("prototype")
@Bean(initMethod = "init", destroyMethod = "destroy")
public Car car() {
return new Car();
}
}
启动类
package com.ouyangxizhu;
import com.ouyangxizhu.config.MainConfigLifeCycle;
import com.ouyangxizhu.utils.PrintBeanDefinitionNamesUtils;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class MainTestLifeCycle {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainConfigLifeCycle.class);
System.out.println("IOC创建完成");
context.getBean("car");
System.out.println("IOC容器准备销毁");
context.close();
System.out.println("IOC容器销毁完成");
}
}
结果
八月 04, 2020 10:02:56 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@31cefde0: startup date [Tue Aug 04 22:02:56 CST 2020]; root of context hierarchy
car constructor...
car ... init...
IOC创建完成
IOC容器准备销毁
car ... destory...
IOC容器销毁完成
八月 04, 2020 10:02:56 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext doClose
信息: Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@31cefde0: startup date [Tue Aug 04 22:02:56 CST 2020]; root of context hierarchy
结果说明
单实例bean初始化方法在创建后调用
单实例bean在容器销毁时销毁
实验五
配置类
package com.ouyangxizhu.config;
import com.ouyangxizhu.bean.Car;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
@Configuration
public class MainConfigLifeCycle {
@Scope("prototype")
@Bean(initMethod = "init", destroyMethod = "destroy")
public Car car() {
return new Car();
}
}
启动类
package com.ouyangxizhu;
import com.ouyangxizhu.config.MainConfigLifeCycle;
import com.ouyangxizhu.utils.PrintBeanDefinitionNamesUtils;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class MainTestLifeCycle {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainConfigLifeCycle.class);
System.out.println("IOC创建完成");
context.getBean("car");
System.out.println("IOC容器准备销毁");
context.close();
System.out.println("IOC容器销毁完成");
}
}
结果
八月 04, 2020 10:05:34 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@31cefde0: startup date [Tue Aug 04 22:05:34 CST 2020]; root of context hierarchy
IOC创建完成
car constructor...
car ... init...
IOC容器准备销毁
IOC容器销毁完成
八月 04, 2020 10:05:34 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext doClose
信息: Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@31cefde0: startup date [Tue Aug 04 22:05:34 CST 2020]; root of context hierarchy
结果说明
多实例bean初始化方法在创建后调用
多实例bean,IOC容器不负责销毁,只有在获取bean的时候才会创建