IOC容器——Bean管理:Bean的作用域和Bean的生命周期

学习之前,娱乐一下下了

db8391e88fba411d965d78fced2a246e.jpg

 

 

Bean的作用域

 

Bean的作用域分为单实例和多实例

单实例:因为在开发当中每个请求都会创建一个对象,这样会极大的消耗cpu和内存,单实例的存在可以减少这种情况的发生

多实例:因为在一个请求改变对象的状态时,可能下一个请求再次请求时可能导致处理产生错误问题

而单实例和多实例的使用标准就是:对象是否含有改变的状态时,就是说在实际应用当中状态是否会发生变化。

创建一个基础类,如果创建数组不懂可以到我主页去了解Spring系列的内容

代码展示:

public class demo1 {
    private String[] aa;   //因为数组最后可以展示单实例和多实例的区别,这里以数组为例

    public void setAa(String[] aa) {
        this.aa = aa;
    }

    public void play(){
        System.out.println(aa);  //最后通过测试类去展示单实例和多实例的区别

    }
}

配置xml文件

单实例:配置文件代码:

注意:在创建bean时默认的都是单实例,可以设置单实例:在bean标签加入scope属性;

属性值有:singleton,prototype,request,session,global session最长用的只用前两种

singleton:表示单实例,默认的都是单实例

protorype:表示多实例

单实例代码:

    <bean id="d1" class="new_study.java_file.region.demo1" >
        <property name="aa" value="作用"></property>
    </bean>

多实例代码:

<bean id="d1" class="new_study.java_file.region.demo1" scope="prototype">
    <property name="aa" value="作用"></property>
</bean>

创建一个测试类去实现注入属性的输出:

测试类代码:

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

public class test {
    @Test
    public void show(){
        ApplicationContext context = new ClassPathXmlApplicationContext("new_study/java_file/region/bean.xml");
        demo1 demo1 = context.getBean("d1",demo1.class);
        demo1 demo2 =  context.getBean("d1",demo1.class);
        demo1.play();
        demo2.play();
    }
}

单实例输出结果:

最后的用黄色标记的为HashCode值,而HashCode值表示的是对象的物理地址,这里可以看出单实例创建的两个类最后的显示的HashCode值一样,说明两次对象的创建都是占用一个物理地址。

3f0efb19929e4d70919c8001f1556b12.png

 多实例输出结果:

绿色荧光标记的hashcode值不相同,说明demo1 和demo2两个对象的创建都是各自占用一个物理地址,这就是多实例。

cd46b53da6b9482f96bd0209726ea6f4.png

Bean的生命周期

生命周期:是指从对象创建到对象销毁的过程共分为七步

第一步:创建bean实例,创建无参数构造

第二步:为bean实例中的属性注入值,通过调用set方法

第三步:把bean实例传递给后置处理器postProcessBeforeInitialization

第四步:调用配置文件中配置的初始化方法

第五步:再次把bean实例传递给后置处理器postProcessAfterInitialization

第六步:获取创建bean实例对象

第七步:执行销毁的方法

代码展示:

bean实例类:

public class demo1 {

    public demo1() {
        System.out.println("bean生命周期的第一步");

    }
    private String testsx;

    public void setTestsx(String testsx) {      
        this.testsx = testsx;
        System.out.println("bean生命周期的第二步");
    }
    public void initMethod(){
        System.out.println("bean周期的第三步");
    }
    public void destoryMethod(){
        System.out.println("bean周期的第五步");
    }
}

创建后置处理器类:实现第三步和第五步

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.lang.Nullable;

public class beanpost 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="d1" class="new_study.java_file.lifeterm.demo1" init-method="initMethod" destroy-method="destoryMethod">                                  
<!--init-method:初始化方法,调用bean实例中的创建的方法      destroy-method:执行销毁的方法调用bean实例销毁方法-->
        <property name="testsx" value="利益风"></property>
</bean>
<bean id="post" class="new_study.java_file.lifeterm.beanpost"></bean> <!--创建后置对象处理器对象,使得第三步和第五步展现出来--> 

创建测试类:测试生命周期的执行步骤

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

public class testdemo {
    @Test
    public void play(){
        ApplicationContext context = new ClassPathXmlApplicationContext("new_study/java_file/lifeterm/bean.xml");
        demo1 demo1 = context.getBean("d1",demo1.class);
        System.out.println("bean生命周期的第四步");
        System.out.println(demo1);
        //手动创建执行对象销毁    
        ((ClassPathXmlApplicationContext)context).close();
    }

}

注意:ClassPathXmlApplicationContext是 ApplicationContext的子接口,在 ApplicationContext并没有close方法需要调用子接口ClassPathXmlApplicationContext中存在的close方法

这可以这样码:输出的结果并没有什么区别

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("new_study/java_file/lifeterm/bean.xml");
       
context.close();

输出结果:

04d54d6d5ad24c6ba5cbf87ab665808b.png

 后续会持续更新学习spring的心得笔记

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不想睡醒的梦

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

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

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

打赏作者

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

抵扣说明:

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

余额充值