Bean的作用域和生命周期

目录

1、Bean的作用域

1.1如何设置单实例还是多实例 

2、Bean 生命周期

2.1什么是Bean的生命周期

2.2 Bean的后期处置


1、Bean的作用域

在 Spring 里面,设置创建 bean 实例是单实例还是多实例。通俗来说就是,我们配置文件xml中

<bean id="名字" class="路径">

在这个配置之后可以通过我们的测试类,可以得到我们创建得Bean实例。在Spring里面。我们创建的bean实例可以是单例对象的也可以是多例对象。在默认情况下是单例对象,Spring里面能够设置,我们创建的Bean实例时单例还是多例的,这个就叫Bean的作用域。单实例只有一个对象,多实例每次都会建一个新的对象。

下面我这里有一个例子来验证

//Book类
public class Book {
    private String bname;
    private String bauthor;

    public void setBname(String bname) {
        this.bname = bname;
    }

    public void setBauthor(String bauthor) {
        this.bauthor = bauthor;
    }
}



//xml配置文件

    <bean id="book" class="com.company.Book">
        <property name="bname" value="zwz1"></property>
        <property name="bauthor" value="zwz2"></property>
    </bean>



//测试类

public class Spring5Test {
    @Test
    public  void testBook1(){

        //加载spring配置文件
        ApplicationContext context =new ClassPathXmlApplicationContext("bean1.xml");

        //获取配置创建的对象
        Book book1=context.getBean("book",Book.class);
        Book book2=context.getBean("book",Book.class);
        System.out.println(book1);
        System.out.println(book2);
    }

}

若想认证我创建的Bean实例数单例对象还是多例对象,如果我输出的俩对象book1和book2地址一样的话,那说明创建的就是单例的对象。结果如下

很显然我创建的也就是默认的情况下Bean都是单例的作用域

1.1如何设置单实例还是多实例 

(1)在 spring 配置文件 bean 标签里面有属性(scope)用于设置单实例还是多实例

(2)scope 属性值 第一个值 默认值,singleton,表示是单实例对象 第二个值 prototype,表示是多实例对象

我们把配置文件修改

 <bean id="book" class="com.company.Book" scope="prototype">
        <property name="bname" value="zwz1"></property>
        <property name="bauthor" value="zwz2"></property>
    </bean>

其它都不变,结果显然

输出的地址值不一样,说明不是一个对象,是多实例的。

 singleton 和 prototype 区别

1、 singleton 单实例,prototype 多实例

2、 设置 scope 值是 singleton 时候,加载 spring 配置文件时候就会创建单实例对象 设置 scope 值是 prototype 时候,不是在加载 spring 配置文件时候创建 对象,在调用 getBean 方法时候创建多实例对象

2、Bean 生命周期

2.1什么是Bean的生命周期

Bean生命周期也就是说,Bean从生成到摧毁的这一过程。

bean 生命周期过程

(1)通过构造器创建 bean 实例(无参数构造)

(2)为 bean 的属性设置值和对其他 bean 引用(调用 set 方法)

(3)调用 bean 的初始化的方法(需要在xml文件进行配置初始化的方法

(4)获取Bean的对象

(5)当容器关闭时候,调用 bean 的销毁的方法(需要在xml文件进行配置销毁的方法

下面我们就来演示一下这一过程

 

 

package com.company;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Spring5Test {
    @Test
    public  void testBook1(){

        //加载spring配置文件
        ApplicationContext context =new ClassPathXmlApplicationContext("bean1.xml");

        //获取配置创建的对象
        Orders orders=context.getBean("orders",Orders.class);

        System.out.println("第四步 获取创建 bean 实例对象");
        System.out.println(orders);
     
    }

}

最后输出结果:

2.2 Bean的后期处置

Bean的后期处置有7部,在初始化之前和初始化之后都会有一步,如下:

(1)通过构造器创建 bean 实例(无参数构造)

(2)为 bean 的属性设置值和对其他 bean 引用(调用 set 方法)

(3)把 bean 实例传递 bean 后置处理器的方法 postProcessBeforeInitialization

(4)调用 bean 的初始化的方法(需要进行配置初始化的方法)

(5)把 bean 实例传递 bean 后置处理器的方法 postProcessAfterInitialization

(6)bean 可以使用了(对象获取到了)

(7)当容器关闭时候,调用 bean 的销毁的方法(需要进行配置销毁的方法)

 演示添加后置处理器效果

1、创建类,实现接口 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;
 }
}

2.注册xml

 3.结果

 有个问题就是,我们就只是创建了一个MyBeanPost bean,而测试类中创建的对象是Orders,并没有直接创建MyBeanPost对象,但是为什么MyBeanPost类中我们写的方法依然会执行呢?

原因就是:当我们在加载配置文件时,会把Orders对象创建和MyBeanPos对象创建,而MyBeanPos实现了BeanPostProcessor接口,Spring就会把这个类作为后置处理器执行,后置处理器会在当前所有配置文件都添加后置处理器的处理。也就是在在初始化之前后处理。里面如果有多个bean则多个bean都会添加后置处理器。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今天你学习了ma

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值