Spring中Bean的生命周期

Spring中关于Bean的生命周期
今天回来复习了一下!

1.普通对象的生命周期:
现有一个普通pojo实体类Dog

class Dog {
    String name;
}

1).出生:
对象的初始化,我们通过对象的构造器来初始化new一个新的对象,此时对象就存在于JVM的堆内存中;
2).使用:
对象的引用Dog dog = new Dog();此时线程栈的临时变量dog指向Java堆区的new Dog对象(我们可以调用该对象的成员方法)也就是该对象存在指向它的引用;当我们使用 dog = null或者指向另一个对象时,原来的Dog对象就会减少一个引用。
3).死亡:
当堆区的某一对象的引用为0时,则我们无法在代码层面去调用到该对象,也就是说我们无法再次该对象,但是该对象仍会存在于堆区内存中;只有当堆区触发垃圾回收时,由于该对象不存在任何的引用,会被垃圾收集器标记为垃圾,进而会被回收释放,此时该对象就会被销毁即死亡。

2.Spring加载Bean的流程:
现有Spring的入门Helloworld

ApplicationContext ioc = new ClassPathXmlApplicationContext("application.xml");
Dog dog = (Dog) context.getBean("dog");
dog.sayHello();

1:解析配置文件:
Spirng提供公共接口ApplicationContext,我们使用ClassPathXmlApplicationContext或者FileSystemXmlApplicationContext去解析配置文件,从注解或者配置文件中读取Bean的配置信息。
2.bean的初始化:
通过解析完的定义信息获取 Bean 实例,调用Spring提供的getBean()方法。

3.Spring中Bean的生命周期:
1.初始化
相当于调用对象的无参构造器new Dog();
2.依赖注入
相当于调用各参数的setter方法
3.如果Bean实现了BeanNameAware接口,Spring将Bean的ID传递给setBeanName()方法
4.如果Bean实现了BeanFactoryAware接口,Spring将调用setBeanDactory(BeanFactory bf)方法并把BeanFactory容器实例作为参数传入。
5.如果Bean实现了ApplicationContextAwaer接口,Spring容器将调用setApplicationContext(ApplicationContext ctx)方法,把y应用上下文作为参数传入。
6.如果Bean实现了BeanPostProcess接口,Spring将调用它们的postProcessBeforeInitialization(预初始化)方法。
7.如果Bean实现了InitializingBean接口,Spring将调用它们的afterPropertiesSet方法,作用与在配置文件中对Bean使用init-method声明初始化的作用一样,都是在Bean的全部属性设置成功后执行的初始化方法。
8.如果Bean实现了BeanPostProcess接口,Spring将调用它们的postProcessAfterInitialization(后初始化)方法
经过以上的步骤一个完整的bean实例就可以被使用了,可以通过getBean获取到了
9(销毁).如果Bean实现了DispostbleBean接口,Spring将调用它的destory方法,作用与在配置文件中对Bean使用destory-method属性的作用一样,都是在Bean实例销毁前执行的方法。

4.Bean的作用域
现有代码:

public class Dog {
    static {
        System.out.println("dog static");
    }
    private String dogName;
    
    public void setDogName(String dogName) {
        this.dogName = dogName;
    }
    public String getDogName() {
        return dogName;
    }
}

Spring支持五个作用域:singleton、prototype、request、session、global session
1.singleton:Spring默认的作用域,表示一个ioc容器仅存在一个该类对象的实例,即单例模式,值得注意的是,单例模式下,Spring容器被创建时就会创建类型为单例的对象。当我们按如下方式启动main方法时:

 		ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
        System.out.println("##########");
        Dog dog = (Dog) ioc.getBean("dog");
        System.out.println(dog.getDogName());

得到如下结果:
dog static
##########
dahuang
可见在getBean之前,bean对象就已经被初始化了;
2.prototype:表示一个bean定义对应多个对象实例,每次的getBean方法都会对应的去进行new一个新的对象,运行与1相同的代码,则结果是
##########
dog static
dahuang
可见prototype属性的对象不是在ioc容器创建时就进行初始化,而是在getBean时
3.request:表示在一次HTTP请求中,一个bean定义对应一个实例;
4.session:表示在一个session对话中,一个bean定义对应一个实例;
5.global session:表示在一个全局的HTTP Session中,一个bean定义对应一个实例

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值