在配置bean的时候有scope属性
singleton,默认值,单例模式,在ioc容器加载时就把实例创建出来。
prototype,多例模式,每次调用全局上下文对象的getBean时创建一个新的实例。
总体分为四个部分
1.实例化
2.属性赋值
3.初始化
4.销毁
接下来就是通过实现接口扩展bean的生命周期了,扩展的生命周期又分为两大类。
1.对多个bean生效的BeanPostProcessor,InstantiationBeanPostProcessor。
实现BeanPostProcessor里面的方法,分别在初始化前后调用。
public class MyBeanPostProcecer implements BeanPostProcessor {
// 在初始化对象之前执行
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("执行了postProcessBeforeInitialization");
return bean;
}
// 在初始化之后执行
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("执行了postProcessAfterInitialization");
return bean;
}
}
实现InstantiationBeanPostProcessor里面的方法,分别在实例化前后调用,设置属性时调用。
public class MyInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {
// 在实例化之前调用
@Override
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
System.out.println("执行了postProcessBeforeInstantiation");
return null;
}
// 在实例化之后调用
@Override
public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
System.out.println("执行了postProcessAfterInstantiation");
return true;
}
// 在调用设置某个属性时调用
@Override
public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {
System.out.println("执行了postProcessProperties");
return pvs;
}
}
2.只对单个bean生效的aware,通常用于获取什么资源,什么aware就是获取什么资源。
Aware方法都是在初始化之前调用的
public class User implements BeanNameAware, BeanClassLoaderAware, BeanFactoryAware {
private String name;
public User() {
System.out.println("调用了无参构造");
}
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
'}';
}
public void setName(String name) {
System.out.println("调用了setName方法");
this.name = name;
}
public void init() throws Exception {
System.out.println("执行了初始化方法");
}
public void destroy() throws Exception {
System.out.println("执行了销毁的方法");
}
@Override
public void setBeanClassLoader(ClassLoader classLoader) {
System.out.println("执行了setBeanClassLoader方法");
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("执行了setBeanFactory方法");
}
@Override
public void setBeanName(String s) {
System.out.println("执行了setBeanName方法");
}
}
调用getBean方法来看结果
public class TestBean {
public static void main(String[] args) {
ApplicationContext factory =
new ClassPathXmlApplicationContext("spring-config.xml");
User user = (User)factory.getBean("user");
System.out.println(user);
// 关闭容器
((ClassPathXmlApplicationContext)factory).registerShutdownHook();
}
}
最后来看调用的结果