目录
bean的作用域
在Spring里面,设置创建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);
}
在控制台输出,从下图可以看出是默认是单实例对象,同时我们也可以设置为多实例对象。
如何设置成单实例还是多实例?
在spring配置文件bean标签里面有属性(scope)用于设置单实例还是多实例。
scope 属性值
第一个值 默认值,singleton 表示单实例对象
第二个值prototype ,表示多实例对象
xml 文件。测试方法和上面一样,run 查看控制台,如下图可知,地址不同,得出设置成多实例对象了。
<bean id="book" class="com.atguigu.spring5.collectiontype.Book" scope="prototype">
<property name="list" ref="booklist"></property>
</bean>
singleton 和 prototype 区别
第一 singleton 单实例 ,prototype 多实例
第二 设置scope值是singleton 的时候,加载spring配置文件时候就会创建单实例对象;设置scope值是prototype,不是在加载spring配置文件的时候创建对象,而是在调用getBean方法时候创建多实例对象
bean的生命周期
生命周期:从对象创建到对象销毁的过程。
- 通过构造器创建bean实例(无参数构造);
- 为bean的属性设置值和其他bean引用(调用set 方法);
- 调用bean的初始化的方法(需要进行配置初始化的方法);
- bean 可以使用了(对象获取到了);
- 当容器关闭时候,调用bean的销毁的方法(需要进行配置销毁的方法)
演示bean的生命周期
基本结构:
<bean id="orders" class="com.atguigu.spring5.bean.Orders">
<property name="oname" value="地方"></property>
</bean>
public class Orders {
private String oname;
public void setOname(String oname) {
this.oname = oname;
}
}
通过构造器创建bean实例(无参数构造):
public class Orders {
//无参数构造
public Orders() {
System.out.println("第一步 执行无参数构造创建bean实例 ");
}
private String oname;
// 为bean的属性设置值
public void setOname(String oname) {
this.oname = oname;
System.out.println("第二步 调用set 方法设置属性值");
}
//创建执行的初始化的方法
public void initMethod(){
System.out.println("第三步 执行初始化的方法");
}
//创建执行的初始化的方法
public void destroyMethod(){
System.out.println("第五步 执行销毁的方法");
}
}
@Test
public void testBean3(){
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的属性设置值和其他bean引用(调用set 方法);
- 把bean实例传递bean后置处理器的方法:postProcessBeforeInitialization
- 调用bean的初始化的方法(需要进行配置初始化的方法);
- 把bean实例传递bean后置处理器的方法:postProcessAfterInitialization
- bean 可以使用了(对象获取到了);
- 当容器关闭时候,调用bean的销毁的方法(需要进行配置销毁的方法)
演示添加后置处理器效果
public class MyBatisPost 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 id="myBeanPost" class="com.atguigu.spring5.bean.MyBatisPost"></bean>