bean 的生命周期#
bean 的生命周期:初始化、创建及使用、销毁
IOC容器在初始化时,会自动创建bean对象(单例模式),然后调用bean对象的init方法,当容器关闭时再调用bean对象的destroy方法
初始化及销毁的几种方式
1. xml方式:
<!--init-method为初始化方法,destroy-method为销毁方法-->
<bean id="student" class="org.lyh.entity.Student" init-method="myInit" destroy-method="myDestroy">
2. 注解方式
1.注解方式使用@Bean+方法返回值方式
//initMethod为初始化方法,destroyMethod为销毁方法
@Bean(initMethod = "myInit" ,destroyMethod = "myDestroy")
public Student myStudent(){
Student student = new Student(2,"李健康",21);
student.setAddress(new Address("兰考县","商丘市睢阳区"));
return student;
}
2. Java规范:JSR250注解方式使用的是三层组件方式
将响应组件加入@Componter注解,value为bean的id值
@PostConstruct为初始化注解
@PreDestroy为销毁注解
@Component(value = "myConverter")
public class MyIntToStringConverter {
@PostConstruct
public void init(){
System.out.println("myConverter初始化");
}
public void myConverter(){
System.out.println("myConverter...");
}
@PreDestroy
public void destroy(){
System.out.println("myConverter销毁");
}
}
将@Componter注解定义的类添加到配置类中(通过扫描器)
//配置类
@Configuration
//扫描器,扫描org.lyh包下的所有三层注解
@ComponentScan("org.lyh")
public class MyConfig {
}
获取@Componter注解中的bean,bean的id值就是该注解的value
ApplicationContext context=new AnnotationConfigApplicationContext(MyConfig.class);
MyIntToStringConverter converter = (MyIntToStringConverter)context.getBean("myConverter");
converter.myConverter();
3. 接口方式##
1. 两个接口
适用于三层组件方式
InitializingBean为初始化接口
DisposableBean为销毁接口
自定义实现类实现InitializingBean接口和DisposableBean接口,重写接口方法
@Component(value = "myFunction")
public class MyFunction implements InitializingBean , DisposableBean {
//销毁方法
@Override
public void destroy() throws Exception {
System.out.println("myfunction销毁方法");
}
public void method(){
}
//初始化方法
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("myfunction初始化");
}
}
2.一个接口(给容器中所有的bean加初始化及销毁方法)
适用于三层组件方式
BeanPostProcessor接口
注意:
BeanPostProcessor接口是给容器中所有的bean加初始化及销毁方法
自定义实现类实现BeanPostProcessor接口,重写接口方法
@Component(value = "myBeanPostProcessor")
public class MyBeanPostProcessor implements BeanPostProcessor {
//初始化 bean为初始化对象,beanName为初始化对象的id
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("myBeanPostProcessor初始化");
System.out.println("初始化对象"+beanName+"****"+bean);
return bean;
}
//销毁
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("myBeanPostProcessor销毁");
System.out.println("销毁对象"+beanName+"****"+bean);
return bean;
}
}