文章目录
Bean的作用域:
设置创建bean单实例还是多实例,默认是单实例对象。
// 演示是否是单实例,如果是单实例对象则输出两个对象的地址是相同的。
@Test
public void testCollection2(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");
Book book1 = context.getBean("book", Book.class);
Book book2 = context.getBean("book", Book.class);
System.out.println(book1);
System.out.println(book2);
}
/* 输出:
* com.wpc.spring5.collection.Book@16c069df
* com.wpc.spring5.collection.Book@16c069df
* 可以看到是相同的地址
*/
如何设置单实例与多实例对象:
- 在spring 配置文件中bean标签里面的
scope属性
用于设置单实例和多实例。 - scope属性值
singleton
:默认值,表示单实例对象prototype
:表示多实例对象
当我们把bean标签中的scope属性设置为prototype多实例后,再次输出。
/* 输出:
* com.wpc.spring5.collection.Book@16c069df
* com.wpc.spring5.collection.Book@2bec854f
* 可以看到是不同的地址
*/
Bean的生命周期
生命周期:就是从对象到销毁的过程
Bean的生命周期:
- 通过构造器创建bean实例(无参构造)
- 为bean的属性设置值和对其它bean的引用(调用set方法)
- 调用bean里面的初始化方法(需要进行配置)
- 获取创建的bean对象(bean可以使用了)
- 当容器关闭的时候,调用bean销毁的方法(需要配置销毁的方法)
演示Bean的生命周期
- 通过构造器创建bean实例(无参构造)
// 无参构造
public Orders(){
System.out.println("第一步:通过构造器创建bean实例(无参构造)");
}
- 为bean的属性设置值和对其它bean的引用(调用set方法)
public void setOname(String oname) {
this.oname = oname;
System.out.println("第二步:为bean的属性设置值和对其它bean的引用(调用set方法)");
}
- 调用bean里面的初始化方法(需要在bean中进行配置)
// 创建执行的初始化方法,本身不会执行,需要配置
public void initMethod(){
System.out.println("第三步:执行初始化的方法");
}
bean的初始化方法配置:
- bean可以使用了(获取创建的bean对象)
@Test
public void testCollection3(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean4.xml");
Orders orders = context.getBean("orders", Orders.class);
System.out.println("第四步:获取创建的bean对象");
System.out.println(orders);
}
- 当容器关闭的时候,调用bean销毁的方法(需要配置销毁的方法)
//创建可以执行的销毁的方法
public void destroyMethod(){
System.out.println("第五步:调用bean销毁的方法");
}
bean销毁配置:
最后在Test测试方法中手动添加销毁
//手动让bean实例销毁
context.close();
}
源码
bean.xml
<bean id="orders" class="com.wpc.spring5.collection.bean.Orders" init-method="initMethod" destroy-method="destroyMethod">
<property name="oname" value="电脑"></property>
</bean>
order类
package com.wpc.spring5.collection.bean;
public class Orders {
// 无参构造
public Orders(){
System.out.println("第一步:通过构造器创建bean实例(无参构造)");
}
private String oname;
public void setOname(String oname) {
this.oname = oname;
System.out.println("第二步:为bean的属性设置值和对其它bean的引用(调用set方法)");
}
// 创建执行的初始化方法,本身不会执行,需要配置
public void initMethod(){
System.out.println("第三步:执行初始化的方法");
}
//创建可以执行的销毁的方法
public void destroyMethod(){
System.out.println("第五步:调用bean销毁的方法");
}
}
Test类,测试输出
@Test
public void testCollection3(){
// ApplicationContext context = new ClassPathXmlApplicationContext("bean4.xml");
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean4.xml");
Orders orders = context.getBean("orders", Orders.class);
System.out.println("第四步:获取创建的bean对象");
System.out.println(orders);
//手动让bean实例销毁,这个方法会执行销毁方法
context.close();
}
/* 输出:
* 第一步:通过构造器创建bean实例(无参构造)
* 第二步:为bean的属性设置值和对其它bean的引用(调用set 方法)
* 第三步:执行初始化的方法
* 第四步:获取创建的bean对象
* com.wpc.spring5.collection.bean.Orders@28194a50
* 第五步:调用bean销毁的方法
*/
bean的后置处理器,更加详细的步骤(多加两步,一共七步)
- 通过构造器创建bean实例(无参构造)
- 为bean的属性设置值和对其它bean的引用(调用set方法)
- 把bean的实例传递给bean的后置处理器(执行
postProcessBeforeInitialization方法
) - 调用bean里面的初始化方法(需要进行配置)
- 把bean的实例传递给bean的后置处理器(执行
postProcessAfterInitialization方法
) - 获取创建的bean对象(bean可以使用了)
- 当容器关闭的时候,调用bean销毁的方法(需要配置销毁的方法)
演示bean的后置处理器
第一步:创建类,实现接口BeanProcessor,创建一个后置处理器
// 创建MybeanPost类,并实现BeanPostProcessor接口
public class MybeanPost 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中对后置处理器进行配置。由于MybeanPost类中实现了BeanPostProcessor接口,所以bean会自动视MybeanPost类为后置处理器。
<bean id="orders" class="com.wpc.spring5.collection.bean.Orders" init-method="initMethod" destroy-method="destroyMethod">
<property name="oname" value="电脑"></property>
</bean>
<!-- 配置后置处理器,由于MybeanPost类中实现了BeanPostProcessor接口,所以bean会自动视MybeanPost类为后置处理器。-->
<bean id="myBeanPost" class="com.wpc.spring5.collection.bean.MybeanPost"></bean>
/* 输出:
* 第一步:通过构造器创建bean实例(无参构造)
* 第二步:为bean的属性设置值和对其它bean的引用(调用set 方法)
* 初始化之前执行的方法
* 第三步:执行初始化的方法
* 初始化之后执行的方法
* 第四步:获取创建的bean对象
* com.wpc.spring5.collection.bean.Orders@28194a50
* 第五步:调用bean销毁的方法
*/