SpringBoot创建Bean之singtone模式与prototype模式

一、单例管理的对象

spring创建的对象,默认都是单例模式。以BeanC为示例,创建对象过程中一些方法的调用属顺序如下:

@Setter
@Getter
public class BeanC implements InitializingBean {

    public BeanC() {
        System.out.println("BeanC construct()");
    }

    public void init() {
        System.out.println("BeanC init()");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("BeanC afterPropertiesSet()");
    }
}

##################################################################################
@Configuration
public class BeanConfiguration {

    @Bean(initMethod = "init")
    public BeanC beanC() {
        return new BeanC();
    }
}

打印结果(对类进行加载的时候就打印了):

BeanC construct()
BeanC afterPropertiesSet()
BeanC init()

1.会在加载Bean的时候就去创建bean
2.首先会调用类的construct
3.如果实现了InitializingBean接口,则会去调用afterPropertiesSet()方法
4.调用initMethod指定的init()方法

二、单例管理的对象

Spring创建的对象,如果想要创建的bean是原型模式,则需要通过设置scop=prototype,SpringBoo设置方式为:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

@Setter
@Getter
public class BeanAA implements InitializingBean, DisposableBean {

    private String name;

    public BeanAA() {
        System.out.println("beanAA construct()");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("beanAA afterPropertiesSet()");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("beanAA destroy()");
    }
}
##################################################################################
@Configuration
public class BeanConfiguration {

    @Bean
    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    public BeanAA beanAA() {
        BeanAA beanAA = new BeanAA();
        beanAA.setName("beanAA");
        return beanAA;
    }
}
三、测试获取bean
	BeanC beanC1 = ApplicationContextUtil.getBean("beanC", BeanC.class);
    System.out.println("get beanC:" + beanC1);
    BeanC beanC2 = ApplicationContextUtil.getBean("beanC", BeanC.class);
    System.out.println("get beanC:" + beanC2);
    
    BeanAA beanAA1 = ApplicationContextUtil.getBean("beanAA", BeanAA.class);
    System.out.println("get beanAA:" + beanAA1);
    BeanAA beanAA2 = ApplicationContextUtil.getBean("beanAA", BeanAA.class);
    System.out.println("get beanAA:" + beanAA2);

打印结果:

	get beanC:indi.cheng.springboot.bean.BeanC@7c80fd7a
    get beanC:indi.cheng.springboot.bean.BeanC@7c80fd7a
    beanAA construct()
    beanAA afterPropertiesSet()
    get beanAA:indi.cheng.springboot.bean.BeanAA@36457c88
    beanAA construct()
    beanAA afterPropertiesSet()
    get beanAA:indi.cheng.springboot.bean.BeanAA@6b282faf

对于原型(prototype)模式的bean,spring创建其对象时,一些初始化方法的调用顺序和单例模式是一样的,但是原型模式下,只有bean在被调用的时候,才会去初始化bean,由上面打印结果可知,单例模式获取的是同一个对象,而原型模式获取的是两个不同的对象。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值