一、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);