目录
在Spring里面,设置创建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);
- }
在控制台输出,从下图可以看出是默认是单实例对象,同时我们也可以设置为多实例对象。

在spring配置文件bean标签里面有属性(scope)用于设置单实例还是多实例。
第一个值 默认值,singleton 表示单实例对象
第二个值prototype ,表示多实例对象
xml 文件。测试方法和上面一样,run 查看控制台,如下图可知,地址不同,得出设置成多实例对象了。
- <bean id="book" class="com.atguigu.spring5.collectiontype.Book" scope="prototype">
- <property name="list" ref="booklist">property>
- bean>

第一 singleton 单实例 ,prototype 多实例
第二 设置scope值是singleton 的时候,加载spring配置文件时候就会创建单实例对象;设置scope值是prototype,不是在加载spring配置文件的时候创建对象,而是在调用getBean方法时候创建多实例对象
生命周期:从对象创建到对象销毁的过程。
- 通过构造器创建bean实例(无参数构造);
- 为bean的属性设置值和其他bean引用(调用set 方法);
- 调用bean的初始化的方法(需要进行配置初始化的方法);
- bean 可以使用了(对象获取到了);
- 当容器关闭时候,调用bean的销毁的方法(需要进行配置销毁的方法)
基本结构:
- <bean id="orders" class="com.atguigu.spring5.bean.Orders">
- <property name="oname" value="地方">property>
- bean>
- public class Orders {
-
- private String oname;
-
- public void setOname(String oname) {
- this.oname = oname;
- }
- }
通过构造器创建bean实例(无参数构造):
- public class Orders {
-
- //无参数构造
- public Orders() {
- System.out.println("第一步 执行无参数构造创建bean实例 ");
- }
-
- private String oname;
- // 为bean的属性设置值
- public void setOname(String oname) {
- this.oname = oname;
- System.out.println("第二步 调用set 方法设置属性值");
- }
-
- //创建执行的初始化的方法
- public void initMethod(){
- System.out.println("第三步 执行初始化的方法");
- }
- //创建执行的初始化的方法
- public void destroyMethod(){
- System.out.println("第五步 执行销毁的方法");
- }
- }
- @Test
- public void testBean3(){
- 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实例传递bean后置处理器的方法:postProcessBeforeInitialization
- 调用bean的初始化的方法(需要进行配置初始化的方法);
- 把bean实例传递bean后置处理器的方法:postProcessAfterInitialization
- bean 可以使用了(对象获取到了);
- 当容器关闭时候,调用bean的销毁的方法(需要进行配置销毁的方法)
演示添加后置处理器效果
- public class MyBatisPost 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="myBeanPost" class="com.atguigu.spring5.bean.MyBatisPost">bean>
