四、spring中使用xml方式的管理bean


在Bean标签中可以通过scope属性指定对象的作用域

  • 单例模式(默认,scope=“singleton)
    • 默认饿汉模式(默认):Spring容器初始化阶段就会完成此对象的创建;
    • 懒汉模式(当在bean标签中设置lazy-init=“true”)获取对象时完成对象的创建。
  • 非单例模式(又称为原型模式,可理解成多例模式scope="prototype )。
    • 每次通过Spring容器获取此bean的对象时都会创建一个新的对象

1 单例饿汉模式

默认情况 ,scope=“singleton”

第一步,在Product的无参构造方法中添加一条打印语句。

package com.yiwu.pojo;

public class Product {
    private String name;
    private double Price;
   
    public Product() 
        System.out.println("生成对象");
	}
  
}

第二步,在xml文件中配置

 <bean id = "product1" class="com.yiwu.pojo.Product"/>

第三步,编写测试类

import com.yiwu.pojo.Product;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest01 {
    public static void main(String[] args) {
        
        System.out.println("容器开始初始化");
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(" applicationContext.xml");
        System.out.println("容器初始化完成");
        
        System.out.println("开始获取实例");
        Product product1 = (Product)applicationContext.getBean("product1");
        System.out.println("第一次获取完成");
        
        Product product2 = (Product)applicationContext.getBean("product1");
        System.out.println("获取实例完成");
        System.out.println(product1);
        System.out.println(product2);

    }
}

第四步,结果

实例在容器初始化的时候生成,每次从容器获取的是同一个实例

容器开始初始化
生成对象
容器初始化完成
开始获取实例
第一次获取完成
获取实例完成
com.yiwu.pojo.Product@80503
com.yiwu.pojo.Product@80503

2 单例懒汉模式

第一步,更改xml

 <bean id = "product1" class="com.yiwu.pojo.Product" lazy-init="true"/>

第二步,结果

实例在第一次获取对象时候生成,之后每次获取的是同一个实例。

容器开始初始化
容器初始化完成
开始获取实例
生成对象
第一次获取完成
获取实例完成
com.yiwu.pojo.Product@80503
com.yiwu.pojo.Product@80503

3 原型/多例模式

scope=“prototype”

在该模式下,所有实例都是在获取实例时生成。

第一步,更改xml

 <bean id = "product1" class="com.yiwu.pojo.Product"scope="prototype"/>

第二步,结果

在获取对象的时候生成实例,每次获取的是不同的实例

容器开始初始化
容器初始化完成
开始获取实例
生成对象
第一次获取完成
生成对象
获取实例完成
com.yiwu.pojo.Product@80503
com.yiwu.pojo.Product@4b553d26

4 Bean生命周期

  • Bean的生命周期是指Bean实例被创建、初始化和销毁的过程。

  • 在Bean的两种作用域singleton和prototype中,Spring容器对Bean的生命周期的管理是不同的。

    • 在singleton作用域中,Spring容器可以管理Bean的生命周期,控制着Bean的创建、初始化和销毁。
    • 在prototype作用域中, Spring容器只负责创建Bean实例,不会管理其生命周期。
  • 在Bean的生命周期中,有两个时间节点尤为重要

    • 实例初始化后
    • 实例销毁前
    • 在这两个时间节点通常需要完成一些指定操作。因此,常常需要对这两个节点进行监控。

第一步,bean中增加两个方法

public void init(){
    System.out.println("bean初始化完成调用");
}

public void destory(){
    System.out.println("bean销毁前调用");
}

第二步,在xml文件添加bean

​ 在bean标签中可以通过 init-method 属性指定当前bean的初始化方法,初始化方法在构造器执行之后执行

​ 在bean标签中可以通过 destroy-method 属性指定当前bean的销毁方法,销毁方法在对象销毁之前执行

 <bean id = "user19" class="com.yiwu.pojo.User" init-method="init" destroy-method="destory">
</bean>

第三步,编写测试方法

import com.yiwu.pojo.User;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest01 {
    public static void main(String[] args) {

        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(" applicationContext.xml");

        User user = (User)applicationContext.getBean("user19");
        //销毁容器里的所有实例
        applicationContext.close();
        System.out.println(user);

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

老去的90后

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

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

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

打赏作者

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

抵扣说明:

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

余额充值