实验9:测试bean的作用域,分别创建单实例和多实例的bean★
bean的作用域:指定bean是否单实例,xxx;默认:单实例的
prototype:多实例的:
- 容器启动默认不会去创建多实例bean
- 获取的时候创建这个bean
- 每次获取都会创建一个新的对象
singleton:单实例的;默认的; - 在容器启动完成之前就已经创建好对象,保存在容器中了。
- 任何获取都是获取之前创建好的那个对象;
request:在web环境下,同一次请求创建一个Bean实例(没用)
session:在web环境下,同一次会话创建一个Bean实例(没用)
在Book的无参构造方法中添加输出语句便于观察容器启动时bean是否被创建
public Book() {
super();
// TODO Auto-generated constructor stub
System.out.println("book被创建。。。");
}
xml配置
<!-- 实验9:测试bean的作用域,分别创建单实例和多实例的bean★ -->
<!-- scope="prototype":设置该实例为多实例 -->
<bean id="book01" class="com.zxy.bean.Book" scope="prototype">
<property name="author" value="吴承恩"></property>
<property name="bookName" value="西游记"></property>
</bean>
测试结果
运行测试程序控制台可看出在xml中注册的多实例Book没有被创建,符合预期结果
将bean的scope属性改为singleton(单实例),测试运行结果。
<bean id="book02" class="com.zxy.bean.Book" scope="singleton">
<property name="author" value="吴承恩"></property>
<property name="bookName" value="西游记"></property>
</bean>
结果显示当运行测试程序时即使没有获取实例bean他也会被创建。
实验10:创建带有生命周期方法的bean
生命周期:bean的创建到销毁;
ioc容器中注册的bean;
- 单例bean,容器启动的时候就会创建好,容器关闭也会销毁创建的bean
- 多实例bean,获取的时候才创建;
我们可以为bean自定义一些生命周期方法;spring在创建或者销毁的时候就会调用指定的方法;
自定义初始化方法和销毁方法; The method must have no arguments,but may throw any exception
首先在Book的bean方法中添加自定义的无返回值的spring在创建或者销毁的时候需要调用的方法;
public class Book {
private String bookName;
private String author;
public void myInit(){
System.out.println("这是图书的初始化方法...");
}
public void myDestory(){
System.out.println("这是图书的销毁方法...");
}
public Book() {
super();
System.out.println("book被创建。。。");
}
//getter/setter代码省略
}
xml配置
<!--
init-method="myInit":指定spring在创建时调用哪个方法
destroy-method="myDestory":指定spring在销毁时调用哪个方法
-->
<bean id="book03" class="com.zxy.bean.Book"
init-method="myInit" destroy-method="myDestory">
<property name="author" value="吴承恩"></property>
<property name="bookName" value="西游记"></property>
</bean>
测试结果
实验11:测试bean的后置处理器:BeanPostProcessor(继承该接口)
package com.zxy.bean;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class MyBeanPostProcessor implements BeanPostProcessor {
/**
* postProcessBeforeInitialization: 初始化之前调用
* Object bean:将要初始化的bean
*/
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
// TODO Auto-generated method stub
System.out.println("postProcessBeforeInitialization...【" + beanName
+ "】bean将要调用初始化方法了....这个bean是这样:【" + bean + "】");
// 返回传入的bean
return bean;
}
/**
* postProcessAfterInitialization: 初始化方法之后调用
* Object bean, String beanName:bean在xml中配置的id
*/
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
// TODO Auto-generated method stub
System.out.println("postProcessAfterInitialization...【" + beanName
+ "】bean初始化方法调用完了...AfterInitialization..");
// 初始化之后返回的bean;返回的是什么,容器中保存的就是什么
return bean;
}
}
引入自定义的BeanPostProcessor可以在创建之前获取到bean对象,所以可以在这里做一些处理。
xml配置信息只需添加一句
<!-- beanPostProcessor:将该自定义类注册入容器 -->
<bean id="beanPostProcessor" class="com.zxy.bean.MyBeanPostProcessor"></bean>
测试结果
今天结束!!!
陌生人加油!!!
下次见~~~