生命周期(Bean的initMethod和destroyMethod属性, InitializingBean和DisposableBean, @PostConstruct和@PreDestroy, BeanPostProcessor)
属性赋值(@Value, @PropertySource)
生命周期
- 构造方法
- 单实例, 在容器启动时创建对象.
- 多实例, 在每次获取时创建对象.
- postProcessBeforeInitialization方法
- 初始化
- postProcessAfterInitialization方法
- 销毁
- 单实例在容器关闭的时候进行销毁.
- 多实例, 容器不会管理这个bean, 容器不会调用销毁方法. 需要我们手动调用
@Bean指定初始化和销毁方法
- 在@Bean注解中使用initMethod和destoryMethod属性
- Car
public class Car {
public Car() {
super();
System.out.println("Car constructor...");
}
public void init() {
System.out.println("car ... init...");
}
public void destory() {
System.out.println("car .. destory...");
}
}
- 配置类
/**
* bean的生命周期
* bean创建 --- 初始化 --- 销毁过程
* 容器管理bean的生命周期:
* 我们可以自定义初始化和销毁方法, 容器在bean进行到当前生命周期的时候调用我们自定义的初始化和销毁方法.
*/
@Configuration
public class MainConfigOfLifeCycle {
@Bean(initMethod = "init", destroyMethod = "destory")
public Car car() {
return new Car();
}
}
InitializingBean与DisposableBean
- 通过让Bean实现这两个接口, 定义初始化逻辑和销毁逻辑.
@Component
public class Cat implements InitializingBean, DisposableBean {
public Cat() {
super();
System.out.println("cat constructor...");
}
@Override
public void destroy() throws Exception {
System.out.println("cat...destory...");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("cat...afterPropertiesSet");
}
}
- 让配置类扫描组件
@ComponentScan("test.bean")
@Configuration
public class MainConfigOfLifeCycle {
//...
}
@PostConstruct和@PreDestroy
- 使用JSR250规范:
- @PostConstruct: 在bean创建完成并且属性赋值完成后, 来执行初始化方法.
- @PreDestroy: 在容器销毁bean之前通知我们进行清理工作.
@Component
public class Dog {
public Dog() {
super();
System.out.println("Dog constructor...");
}
//对象创建并赋值之后调用
@PostConstruct
public void init() {
System.out.println("Dog...@PostConstruct");
}
//容器移除对象之前
@PreDestroy
public void destroy() {
System.out.println("Dog...@PreDestroy");
}
}
BeanPostProcessor
- BeanPostProcessor是bean的后置处理器, 在bean初始化前后进行一些处理工作.
- postProcessBeforeInitialization: 初始化之前
- postProcessAfterInitialization: 在初始化之后工作.
//将后置处理器加入到容器中
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
/**
* bean: 要处理的组件中的bean.
* beanName: bean的id
*/
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessBeforeInitialization" + bean + "==>" + beanName);
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessAfterInitialization" + bean + "==>" + beanName);
return bean;
}
}
属性赋值
@Value注解
- 在bean中的属性上加@Value注解可实现赋值.
- @Value可赋的值
- 八大基本类型, String
- 可以写SpEL: #{ }
- 可以写${ }: 取出配置文件中的值(在运行环境变量里面的值)
public class Person {
@Value("张三")
private String name;
@Value("#{20-2}")
private Integer age;
//...
}
@PropertySource
- 若想取出配置文件中的值实现赋值, 仅用@Value是不行的, 还需要在配置类上使用@PropertySource注解标明配置类的位置.
- 配置类
//使用@PropertySource读取外部配置文件中的k/v保存到运行的环境变量中.
@PropertySource(value = { "classpath:/person.properties" })
@Configuration
public class MainConfigOfPropertyValues {
//...
}
- Person
public class Person {
@Value("张三")
private String name;
@Value("#{20-2}")
private Integer age;
@Value("${person.nickName}")
private String nickName;
//...
}
- 当然, 配置文件中的值还可以从环境变量中获取
@Test
public void test01() {
//1.创建ioc容器
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(MainConfigOfPropertyValues.class);
ConfigurableEnvironment environment = ac.getEnvironment();
String property = environment.getProperty("person.nickName");
System.out.println(property);
ac.close();
}