Spring03——bean的生命周期及作用域

1. 默认情况下, IOC 容器中的 bean 是单例的! 若对象是单例的, 则在创建 IOC 容器时即创建 bean 的实例, 并对 bean 的属性进行初始化. 
2. 可以通过 bean 的 scope 属性来修改 bean 的作用域. 若取值为 prototype, 则 bean 为原型的: 每次向容器获取实例, 得到的都是一个新的对象.
而且, 不在创建 IOC 容器时创建 bean 的实例了. 

1.建立实体的构造函数和set方法,并添加输出

2.bean的配置文件:

 <bean id="user" class="com.wj.spring.entityLive.User" p:userNam="bxklk" scope="singleton"></bean>

通常,默认情况下bean都是单例的

3.main方法:

public class Main {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");
        User user1 = (User) ctx.getBean("user");
        User user2 = (User) ctx.getBean("user");
        System.out.println(user1==user2);
    }
}

通过user1==user2 来判断是否是两个同样的对象

输出:

构造方法和set方法都只调用一次,且user1==user2

若更改scope=protype

输出结果,两个次调用构造函数和set方法,user1!=user2

其他的作用域:

二.关于bean的生命周期,在user实体中添加 init(初始化)和destroy(销毁)两个方法,名字可以随便起,这里只是为了便于记忆。

1.配置xml,添加两个属性:

1 一般地, 讨论 bean 的生命周期, 是建立在 bean 是单例的基础上的. 
2 可以为 bean 指定 init 和 destroy 方法

2.main方法如下:添加ctx.close(),销毁ioc容器

3.输出

三.面试题常问的bean的后置处理器如何健全bean的生命周期操作:

bean的后置处理器允许在调用bean的init方法前后对bean进行额外处理,比如检查bean的准确性。

实现顺序:

1.调用bean的构造方法

2.为bean的属性设值

3.将bean的实例传给后置处理器中的postProcessBeforeInitalization方法

4.调用bean的初始化方法(init)

5.将bean的实例传递给bean的后置处理器中的postProcessAfterInitalization方法

6使用bean

7.在ioc销毁时调用bean的destory方法

1.首先建立后置处理器

通过实现BeanPostPrcessor 并实现postProcessBeforeInitialization  以及 postProcessAfterInitialization 方法,这里输出bean以及beanName

package com.wj.spring.entityLive;

import org.springframework.beans.BeansException;

/**
 * @Author: wj
 * @Date: 2018/11/19 12:25
 * @Version 1.0
 */
public class BeanPostProcessor implements org.springframework.beans.factory.config.BeanPostProcessor {
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessBeforeInitialization:"+bean+",beanName:"+beanName);
        return bean;
    }

    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessAfterInitialization:"+bean+",beanName:"+beanName);
        return bean;
    }
}

2.在xml中配置bean的后置处理器:

3.输出:

输出结果与前面的顺序相吻合,调用构造器,set方法,beafore、init、after

4.拓展一下后置处理器的返回:

更改 BeanPostProcessor类,令其返回新建的User实体类

输出结果如下:

可以将本次输出与上次做一下对比

猜你喜欢

转载自blog.csdn.net/weixin_38520617/article/details/84236972