一、Bean的作用域
1. 在Spring里面,设置创建的bean实例是单实例还是多实例?
public void test1(){
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
User user = context.getBean("user",User.class);
User user1 = context.getBean("user",User.class);
System.out.println(user);
System.out.println(user1);
}
- 测试结果
分析结果发现我们获取的bean是相同的,默认为单实例对象
2. 如何设置单实例还是多实例?
- 在spring配置文件bean标签里面有属性scope用于设置单实例还是多实例
- scope属性值
- 默认值,singleton,表示单实例对象
2.prototype,表示是多实例对象
<bean id="user" class="com.github.entity.User" scope="prototype">
<property name="name" value="zhangsan"></property>
<property name="age" value="15"></property>
<property name="gender" value="男"></property>
</bean>
分析结果发现获取的bean不相同
3. singleton和prototype区别
- singleton单实例,prototype为多实例
- 设置scope值是singleton时候,加载spring配置文件时候就会创建单实例对象
- 设置scope值是prototype时候,不是在加载spring配置文件的时候创建对象,在调用getBean方法时候创建多实例对象
二、Bean生命周期
1.生命周期
- 从对象创建到对象销毁的过程
2. bean生命周期
- 通过构造器创建bean实例(无参数构造)
- 为bean的属性设置值和对其他bean引用(调用set方法)
- 把bean实例传递给bean前置处理器的方法postProcessBeforeInitialization
- 调用bean的初始化方法
- 把bean实例传递给bean后置处理器的方法postProcessAfterInitialization
- 获取bean实例对象
- 当容器关闭时候,调用bean的销毁方法
3.演示bean生命周期
- 创建Order类
public class Order {
String name;
public Order() {
System.out.println("第一步:调用无参构造方法");
}
public void setName(String name) {
this.name = name;
System.out.println("第二步:调用set方法");
}
public void add(){
System.out.println("第四步:调用初始化方法");
}
public void sub(){
System.out.println("第七步:调用销毁方法");
}
}
- 实现BeanPostProcessor接口
public class MybeanPost implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("第三步:调用before方法");
return null;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("第五步:调用After方法");
return null;
}
}
- 创建配置xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="order" class="com.github.entity.Order" init-method="add" destroy-method="sub">
<property name="name" value="订单"></property>
</bean>
<bean id="mybeanPost" class="com.github.entity.MybeanPost"></bean>
</beans>
- 编写测试类
public class OrderTest {
@Test
public void test(){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans1.xml");
Order order = context.getBean("order",Order.class);
System.out.println("第六步:获取实例对象");
context.close();
}
}
- 运行结果如图