我们都知道bean在声明式定义中可以通过xml文件注入还有@bean,@Component注解来定义bean,不过在spring4以后已经渐渐开始提倡使用注解方式来声明bean了,这里我们就按照注解方式声明来讲了
我们都知道bean的生命周期要经历 获取
bean名→
无参实例化→
依赖注入(属性赋值)→
(BeanPostProcessor)初始化前→
初始化→
(BeanPostProcessor)初始化后→
aop动态代理→
使用→
销毁。
其中我们经常控制操作的步骤就是初始化和销毁,下面就来介绍下怎么自定义设置初始化和销毁方法。
1. @Bean的注解的initMethod、DestroyMethod属性
这个是我们比较常用的
@Configuration
public class SpringConfig {
@Bean(name = "cat", initMethod = "init", destroyMethod = "destroy")
public Cat getCat() {
return new Cat();
}
}
@Configuration可以不写,不过我们一般都会写上,上面的name就是bean的名字,initMethod就是bean里定义的初始化方法,destroymethod就是bean里定义的销毁方法,
2. bean实现InitializingBean、DisposableBean接口
上面那种需要在声明bean的时候指定好方法,那么有没有一种在写bean类的时候就设计好的调用初始化和销毁的方法呢,那么我们就有了下面的
public class Dog implements InitializingBean, DisposableBean {
public Dog() {
System.out.println("dog...constructor...");
}
// Dog类的初始化方法
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("dog...afterPropertiesSet...");
}
// Dog类的销毁方法
@Override
public void destroy() throws Exception {
System.out.println("dog...destroy...");
}
}
实现InitialzingBean接口的afterPropertiesSet方法,即为bean的初始化方法。
实现DisposableBean接口的destroy方法,即为bean的销毁方法。
这时声明bean的时候只需要@bean(name="dog")了
3. @PostConstruct、@PreDestroy注解
上面第二种对接口实现也比较麻烦,能不能直接用注解来定义呢? 答案是可以的,我们直接上代码
public class Tiger {
public Tiger() {
System.out.println("tiger...constructor");
}
// 初始化方法
@PostConstruct
public void init() {
System.out.println("tiger...init...");
}
// 销毁方法
@PreDestroy
public void destroy() {
System.out.println("tiger...destroy...");
}
}
同样,只需要@bean(name="dog")声明就好了
根据上面的bean声明周期,我们可以知道bean初始化前后还有一种增加方法,也就是beanPostProcessor
public class MyBeanPostProcessor implements BeanPostProcessor {
/**
* 在初始化之前执行
* @param bean 初始化的bean
* @param beanName bean的名字
* @return 初始化的bean或者包装过的bean
* @throws BeansException
*/
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println(beanName + " ==> " + "postProcessBeforeInitialization...");
return bean;
}
/**
* 在初始化之后执行
* @param bean 初始化的bean
* @param beanName bean的名字
* @return 初始化的bean或者包装过的bean
* @throws BeansException
*/
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println(beanName + " ==> " + "postProcessAfterInitialization...");
return bean;
}
}
这个对容器内所有的bean都会执行一遍,