Bean的作用域以及生命周期

一、Bean的作用域

Spring默认情况下,创建的Bean都是单实例对象

    @Test
    public void test1(){

        //1.加载Spring配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("userBean.xml");

        //2.获取配置创建的对象
        User user1 = context.getBean("User", User.class);
        User user2 = context.getBean("User", User.class);
        System.out.println(user1);
        System.out.println(user2);
        System.out.println(user1 == user2);
    }

输出结果:
在这里插入图片描述
还可以设置为多实例对象模式,在 Spring配置文件 bean 标签里面有属性scope用于设置单实例还是多实例。

	<!--prototype为多实例,singleton为单实例-->
    <bean id="User" class="spring5.User" scope="prototype"></bean>

再次测试输出结果为:
在这里插入图片描述
设置 scope 值是 singleton 时候,加载 spring 配置文件时候就会创建单实例对象。
设置 scope 值是 prototype 时候,不是在加载 spring 配置文件时候创建对象,而是在调用getBean 方法时候创建多实例对象,每次都会创建一个新的对象。

二、Bean的生命周期

Bean的生命周期指的是从对象创建到销毁的整个过程

  • 通过构造器创建 bean 实例(无参数构造)
  • 为 bean 的属性设置值和对其他 bean 引用(调用 set 方法)
  • 调用 bean 的初始化的方法(需要进行配置初始化的方法)
  • 获取并使用bean
  • 当容器关闭时候,调用 bean 的销毁的方法(需要进行配置销毁的方法)

userBean.xml配置文件

    <bean id="user" class="bean.User" init-method="initMethod" destroy-method="destroyMethod">
        <property name="userName" value="张三"></property>
    </bean>

User

public class User {
    private String userName;

    public User() {
        System.out.println("第一步:执行无参构造方法,创建bean实例");
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        System.out.println("第二步:调用set方法设置属性的值");
        this.userName = userName;
    }

    //创建执行的初始化方法,需要在配置文件中进行配置
    public void initMethod(){
        System.out.println("第三步:执行初始化方法");
    }
}

测试获取bean对象,并手动销毁bean对象

    @Test
    public void test4(){

        //1.加载Spring配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("user.xml");

        //2.获取配置创建的对象
        User user = context.getBean("user", User.class);
        System.out.println("第四步:获取创建的bean实例对象");
        System.out.println(user);

        //手动让bean对象销毁,ClassPathXmlApplicationContext是ApplicationContext的实现类
        ((ClassPathXmlApplicationContext)context).close();

    }

输出结果:
在这里插入图片描述

实际上在第三步执行set方法之前之后还有两小步,是将bean实例传递给bean后置处理器的方法。

创建类,实现接口 BeanPostProcessor,创建后置处理器

public class UserBeanPost 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之后,会给所有的bean对象添加后置处理器

    <bean id="user" class="bean.User" init-method="initMethod" destroy-method="destroyMethod">
        <property name="userName" value="张三"></property>
    </bean>

    <bean id="userBeanPost" class="bean.UserBeanPost"></bean>

输出结果:
在这里插入图片描述
所以Bean的生命周期严格来说一共有七步

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值