JAVA Spring IOC Bean的作用域与生命周期演示

Bean的作用域:

设置创建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);

}

/* 输出:
* com.wpc.spring5.collection.Book@16c069df
* com.wpc.spring5.collection.Book@16c069df
* 可以看到是相同的地址
*/

如何设置单实例与多实例对象:
  1. 在spring 配置文件中bean标签里面的 scope属性用于设置单实例和多实例。
  2. scope属性值
    1. singleton :默认值,表示单实例对象
    2. prototype:表示多实例对象
      在这里插入图片描述

当我们把bean标签中的scope属性设置为prototype多实例后,再次输出。

/* 输出:
* com.wpc.spring5.collection.Book@16c069df
* com.wpc.spring5.collection.Book@2bec854f
* 可以看到是不同的地址
*/

Bean的生命周期

生命周期:就是从对象到销毁的过程

Bean的生命周期:
  1. 通过构造器创建bean实例(无参构造)
  2. 为bean的属性设置值和对其它bean的引用(调用set方法)
  3. 调用bean里面的初始化方法(需要进行配置)
  4. 获取创建的bean对象(bean可以使用了)
  5. 当容器关闭的时候,调用bean销毁的方法(需要配置销毁的方法)
演示Bean的生命周期
  1. 通过构造器创建bean实例(无参构造)
    // 无参构造
    public Orders(){
        System.out.println("第一步:通过构造器创建bean实例(无参构造)");
}
  1. 为bean的属性设置值和对其它bean的引用(调用set方法)
    public void setOname(String oname) {
        this.oname = oname;
        System.out.println("第二步:为bean的属性设置值和对其它bean的引用(调用set方法)");
    }
  1. 调用bean里面的初始化方法(需要在bean中进行配置)
    // 创建执行的初始化方法,本身不会执行,需要配置
    public void initMethod(){
        System.out.println("第三步:执行初始化的方法");
    }

  bean的初始化方法配置:
在这里插入图片描述

  1. bean可以使用了(获取创建的bean对象)
    @Test
    public void testCollection3(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean4.xml");
        Orders orders = context.getBean("orders", Orders.class);
        System.out.println("第四步:获取创建的bean对象");
        System.out.println(orders);
    }
  1. 当容器关闭的时候,调用bean销毁的方法(需要配置销毁的方法)
    //创建可以执行的销毁的方法
    public void destroyMethod(){
        System.out.println("第五步:调用bean销毁的方法");
    }

  bean销毁配置:
在这里插入图片描述

 最后在Test测试方法中手动添加销毁

        //手动让bean实例销毁
        context.close();
    }

源码

bean.xml

    <bean id="orders" class="com.wpc.spring5.collection.bean.Orders" init-method="initMethod" destroy-method="destroyMethod">
        <property name="oname" value="电脑"></property>
    </bean>

order类

package com.wpc.spring5.collection.bean;

public class Orders {

    // 无参构造
    public Orders(){
        System.out.println("第一步:通过构造器创建bean实例(无参构造)");
    }
    private String oname;

    public void setOname(String oname) {
        this.oname = oname;
        System.out.println("第二步:为bean的属性设置值和对其它bean的引用(调用set方法)");
    }

    // 创建执行的初始化方法,本身不会执行,需要配置
    public void initMethod(){
        System.out.println("第三步:执行初始化的方法");
    }

    //创建可以执行的销毁的方法
    public void destroyMethod(){
        System.out.println("第五步:调用bean销毁的方法");
    }
}


Test类,测试输出

    @Test
    public void testCollection3(){
      //  ApplicationContext context = new ClassPathXmlApplicationContext("bean4.xml");
        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的引用(调用set 方法)
* 第三步:执行初始化的方法
* 第四步:获取创建的bean对象
* com.wpc.spring5.collection.bean.Orders@28194a50
* 第五步:调用bean销毁的方法
*/

bean的后置处理器,更加详细的步骤(多加两步,一共七步)
  1. 通过构造器创建bean实例(无参构造)
  2. 为bean的属性设置值和对其它bean的引用(调用set方法)
  3. 把bean的实例传递给bean的后置处理器(执行postProcessBeforeInitialization方法
  4. 调用bean里面的初始化方法(需要进行配置)
  5. 把bean的实例传递给bean的后置处理器(执行postProcessAfterInitialization方法)
  6. 获取创建的bean对象(bean可以使用了)
  7. 当容器关闭的时候,调用bean销毁的方法(需要配置销毁的方法)

演示bean的后置处理器

 第一步:创建类,实现接口BeanProcessor,创建一个后置处理器

// 创建MybeanPost类,并实现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;
    }
}


 第二步:在bean中对后置处理器进行配置。由于MybeanPost类中实现了BeanPostProcessor接口,所以bean会自动视MybeanPost类为后置处理器。

    <bean id="orders" class="com.wpc.spring5.collection.bean.Orders" init-method="initMethod" destroy-method="destroyMethod">
        <property name="oname" value="电脑"></property>
    </bean>

<!--    配置后置处理器,由于MybeanPost类中实现了BeanPostProcessor接口,所以bean会自动视MybeanPost类为后置处理器。-->
    <bean id="myBeanPost" class="com.wpc.spring5.collection.bean.MybeanPost"></bean>


/* 输出:
* 第一步:通过构造器创建bean实例(无参构造)
* 第二步:为bean的属性设置值和对其它bean的引用(调用set 方法)
* 初始化之前执行的方法
* 第三步:执行初始化的方法
* 初始化之后执行的方法
* 第四步:获取创建的bean对象
* com.wpc.spring5.collection.bean.Orders@28194a50
* 第五步:调用bean销毁的方法
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值