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实体类
输出结果如下:
可以将本次输出与上次做一下对比