一、Bean的作用域
Spring默认情况下,创建的Bean
都是单实例对象
@Test
public void test1(){
//1.加载Spring配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("userBean.xml");
//2.获取配置创建的对象
User user1 = context.getBean("User", User.class);
User user2 = context.getBean("User", User.class);
System.out.println(user1);
System.out.println(user2);
System.out.println(user1 == user2);
}
输出结果:
还可以设置为多实例对象模式,在 Spring配置文件 bean
标签里面有属性scope
用于设置单实例还是多实例。
<!--prototype为多实例,singleton为单实例-->
<bean id="User" class="spring5.User" scope="prototype"></bean>
再次测试输出结果为:
设置 scope
值是 singleton
时候,加载 spring 配置文件时候就会创建单实例对象。
设置 scope
值是 prototype
时候,不是在加载 spring 配置文件时候创建对象,而是在调用getBean
方法时候创建多实例对象,每次都会创建一个新的对象。
二、Bean
的生命周期
Bean
的生命周期指的是从对象创建到销毁的整个过程
- 通过构造器创建
bean
实例(无参数构造) - 为 bean 的属性设置值和对其他
bean
引用(调用set
方法) - 调用
bean
的初始化的方法(需要进行配置初始化的方法) - 获取并使用
bean
- 当容器关闭时候,调用
bean
的销毁的方法(需要进行配置销毁的方法)
userBean.xml
配置文件
<bean id="user" class="bean.User" init-method="initMethod" destroy-method="destroyMethod">
<property name="userName" value="张三"></property>
</bean>
User
类
public class User {
private String userName;
public User() {
System.out.println("第一步:执行无参构造方法,创建bean实例");
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
System.out.println("第二步:调用set方法设置属性的值");
this.userName = userName;
}
//创建执行的初始化方法,需要在配置文件中进行配置
public void initMethod(){
System.out.println("第三步:执行初始化方法");
}
}
测试获取bean
对象,并手动销毁bean
对象
@Test
public void test4(){
//1.加载Spring配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("user.xml");
//2.获取配置创建的对象
User user = context.getBean("user", User.class);
System.out.println("第四步:获取创建的bean实例对象");
System.out.println(user);
//手动让bean对象销毁,ClassPathXmlApplicationContext是ApplicationContext的实现类
((ClassPathXmlApplicationContext)context).close();
}
输出结果:
实际上在第三步执行set
方法之前和之后还有两小步,是将bean
实例传递给bean
后置处理器的方法。
创建类,实现接口 BeanPostProcessor
,创建后置处理器
public class UserBeanPost implements BeanPostProcessor {
//初始化之前的方法
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("在初始化之前执行的方法");
return bean;
}
//初始化之后的方法
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("在初始化之后执行的方法");
return bean;
}
}
在配置文件中配置后置处理器,创建后置处理器的bean之后,会给所有的bean对象添加后置处理器
<bean id="user" class="bean.User" init-method="initMethod" destroy-method="destroyMethod">
<property name="userName" value="张三"></property>
</bean>
<bean id="userBeanPost" class="bean.UserBeanPost"></bean>
输出结果:
所以Bean
的生命周期严格来说一共有七步。