一、springbean的生命周期
1、bean生命周期包含的内容模块
bean的生命周期:bean创建-------初始化------销毁的过程
bean创建:构造对象
单实例:在容器启动的时候创建对象。
多实例:在每次获取的时候创建对象。
bean初始化:对象创建完成,并赋值好,调用初始化方法。
bean销毁:单实例:容器关闭的时候销毁。
多实例:容器不会管理这个bean,容器不会调用销毁方法,需要自己手动调用销毁。
2、bean在容器中初始化和销毁的方式
我们可以自定义初始化和销毁方法,容器在bean进行到当前生命周期的时候来调用我们自定义的初始化方法和销毁方法。
- 指定初始化和销毁方法(指定init-method和的destroy-method)。
- 通过让bean实现InitializingBean接口(定义初始化逻辑),通过DisposableBean接口(定义销毁逻辑)。
- 可以使用JSR250。
- BeanPostProcessor[接口]: bean的后置处理器。
(1)、指定初始化和销毁方法(指定init-method和的destroy-method)
老版本基于xml配置的:
<bean id="person" class="com.tan.bean.Person" init-method="" destroy-method="">
<property name="name" value="张三"></property>
<property name="age" value="18"></property>
</bean>
基于注解的创建方式:
第一步:先创建我的bean对象
public class Car {
//构造函数,创建对象赋值阶段
public Car() {
System.out.println("car constructor ....");
}
//bean初始化方法
public void init() {
System.out.println("car init ....");
}
//bean销毁犯法
public void detory() {
System.out.println("car detory ....");
}
}
第二步:配置类配置注册bean(@Bean(initMethod = "init", destroyMethod = "detory"))
@Bean(initMethod = "init", destroyMethod = "detory")
public Car car() {
return new Car();
}
(2)、通过让bean实现InitializingBean接口(定义初始化逻辑),通过DisposableBean接口(定义销毁逻辑)
分别让bean去实现InitializingBean,DisposableBean接口中的destroy销毁方法和afterPropertiesSet初始化方法,具体实现如下:
@Component
public class Cat implements InitializingBean,DisposableBean{
public Cat() {
System.out.println("cat constructor ....");
}
public void destroy() throws Exception {
System.out.println("cat destroy ....");
}
public void afterPropertiesSet() throws Exception {
System.out.println("cat afterPropertiesSet ....");
}
}
(3)、通过使用JSR250给bean初始化,销毁
使用以下两个注解来实现
@PostConstruct:在bean创建完成并且属性赋值完成,来执行初始化方法。 @PreDestroy:在容器销毁bean之前通知我们进行清理工作。
具体实现如下:
@Component
public class Dog {
public Dog() {
System.out.println("dog constructor ....");
}
//对象创建并赋值之后调用
@PostConstruct
public void init() {
System.out.println("dog @PostConstruct ....");
}
//容器对象移除之前调用
@PreDestroy
public void detory() {
System.out.println("dog @PreDestroy ....");
}
}
(4)、BeanPostProcessor[接口]: bean的后置处理器
在bean初始化前后进行一些处理工作postProcessBeforeInitialization:在初始化之前工作 postProcessAfterInitialization: 在初始化之后工作
具体实现:
/**
* 后置处理器:初始化前后进行处理工作
*/
@Component
public class MyBeanPostProcessor implements BeanPostProcessor{
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessBeforeInitialization..." + beanName + "=>" + bean);
return bean;
}
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessAfterInitialization..." + beanName + "=>" + bean);
return bean;
}
}
二、属性赋值
通过@Value注解进行属性赋值
属性赋值的多种方式:
1、基于数值的赋值
2、可以写SpEL #{}
3、可以写${},取出配置文件中的值(在运行环境变量里面的值)
@Value("张三")
private String name;
@Value("#{20-2}")
private Integer age;
@Value("${person.nickName}")
private String nickName;
基于配置文件方式的引用,${}
第一步,创建配置.properties文件
person.nickName=李四
第二步,在bean配置类中引用.properties文件
@PropertySource(value = {"classpath:/person.properties"})
读取外部配置文件中的k/v保存到运行的环境变量中,加载完外部的配置文件后使用${}取出配置文件中的值。
另外一种方式获取配置文件中的值
//获取配置文件中的值
ConfigurableEnvironment environment = annotationConfigApplicationContext.getEnvironment();
String pro = environment.getProperty("person.nickName");
System.out.println(pro);