spring的核心技术---bean的生命周期加案例分析详细易懂

简介: spring的核心技术---bean的生命周期加案例分析详细易懂

一.spring管理JavaBean的初始化过程(生命周期)

       在Spring框架中,Bean的生命周期是指从它被创建、初始化,到最终被销毁的整个过程。
       需要注意的是,Bean的销毁并不是由Java的垃圾回收器自动处理的,而是由Spring容器负责管理和销毁的。

下面一张图就是bean的整个生命周期图,它的一个初始化过程

Spring Bean的生命周期:

1)通过XML、Java annotation(注解)以及Java Configuration(配置类)
       等方式配置JavaBean,现在我用的是xml配置文件的方式
2)BeanDefinitionReader:解析Bean的定义。在Spring容器启动过程中,
       会将Bean解析成Spring内部的BeanDefinition结构;
       理解为:将spring.xml中的<bean>标签转换成BeanDefinition结构
       有点类似于XML解析
3)BeanDefinition:包含了很多属性和方法。例如:id、class(类名)、
       scope、ref(依赖的bean)等等。其实就是 将bean(例如<bean>)的定义信息
       存储到这个对应BeanDefinition相应的属性中,最终得到List<BeanDefinition>
4)BeanFactoryPostProcessor:是Spring容器功能的扩展接口。JavaBean初始化之前                先执行自己的业务
5)BeanFactory:bean工厂。它按照我们的要求生产我们需要的各种各样的bean。
6)Aware感知接口:在实际开发中,经常需要用到Spring容器本身的功能资源
       例如:BeanNameAware、ApplicationContextAware等等
       BeanDefinition 实现了 BeanNameAware、ApplicationContextAware
7)BeanPostProcessor:后置处理器。在Bean对象实例化和引入注入完毕后,
8)destory:销毁

二.spring的JavaBean管理中单例模式及原型(多例)模式

       2.1 . 默认为单例,但是可以配置多例

               单例的优点:节约内存;缺点:有变量污染;JavaBean是跟着spring上下文初始化的,容器生对象生,容器死对象死,因为单例只创建一次,所以最开始的时候就创建

               多例的优点:无变量污染;缺点:及其消耗内存;JavaBean是使用的时候才会创建,销毁跟着jvm走

举例说明:假如你有两个儿子,他们两个都想要一个玩具车。

         案例一,买一个,哥哥上午玩,弟弟下午玩,但是上午哥哥玩的时候如果玩具脏了,            刮花了,那么对于弟弟而言这个玩具已经不是原有车的状态,但是给我们省钱了=====》单例

       案例二:买两个,一人一个,这样就不存在污染,各玩各的,但是我们的钱包就扁了======》多例

       2.2.举例论证

               2.2.1 默认单例

      这个就是那辆车,bean对象,这里设了一个变量属性 num 来验证是不是单例,变量改变了

package com.zking.beanlife;
import java.util.List;
public class ParamAction {
  private int age;
  private String name;
  private List<String> hobby;
  private int num = 1;
  // private UserBiz userBiz = new UserBizImpl1();
  public ParamAction() {
    super();
  }
  public ParamAction(int age, String name, List<String> hobby) {
    super();
    this.age = age;
    this.name = name;
    this.hobby = hobby;
  }
  public void execute() {
    // userBiz.upload();
    // userBiz = new UserBizImpl2();
    System.out.println("this.num=" + this.num++);
    System.out.println(this.name);
    System.out.println(this.age);
    System.out.println(this.hobby);
  }
}

       再模拟方法数据,进行测试

package com.zking.beanlife;
public class InstanceFactory {
  public void init() {
    System.out.println("初始化方法");
  }
  public void destroy() {
    System.out.println("销毁方法");
  }
  public void service() {
    System.out.println("业务方法");
  }
}

      然后,进行xml文件配置,

       最后前台测试:是否默认为单例模式,并且变量被污染了,num值发生了变化,说明被污染了,默认为单例模式

        2.2.2 设置多例

      原来的代码不变,我们再xml配置文件中,选择多例

        前台测试结果,发现num值没有被污染

2.2.3单例与多例的初始化的时间点

      当是多例的时候,不会初始化

       而当单例的时候,会初始化

三.总结

单例和多例的选择也需要考虑性能和资源消耗。单例可以节省资源,但可能存在线程安全问题;多例可以保证独立性,但会增加对象创建和销毁的开销。单例适合那些无状态或者线程安全的Bean,多例适合那些有状态的Bean或者需要每次请求都创建一个新实例的情况

相关文章
|
6天前
|
XML Java 数据格式
spring复习02,xml配置管理bean
详细讲解了Spring框架中基于XML配置文件管理bean的各种方式,包括获取bean、依赖注入、特殊值处理、属性赋值、集合类型处理、p命名空间、bean作用域及生命周期和自动装配。
spring复习02,xml配置管理bean
|
9天前
|
设计模式 Java Spring
spring源码设计模式分析(五)-策略模式
spring源码设计模式分析(五)-策略模式
|
7天前
|
负载均衡 Java 网络架构
实现微服务网关:Zuul与Spring Cloud Gateway的比较分析
实现微服务网关:Zuul与Spring Cloud Gateway的比较分析
20 5
|
9天前
|
消息中间件 设计模式 缓存
spring源码设计模式分析(四)-观察者模式
spring源码设计模式分析(四)-观察者模式
|
9天前
|
设计模式 Java Spring
spring源码设计模式分析(六)-模板方法模式
spring源码设计模式分析(六)-模板方法模式
|
6天前
|
存储 缓存 Java
在Spring Boot中使用缓存的技术解析
通过利用Spring Boot中的缓存支持,开发者可以轻松地实现高效和可扩展的缓存策略,进而提升应用的性能和用户体验。Spring Boot的声明式缓存抽象和对多种缓存技术的支持,使得集成和使用缓存变得前所未有的简单。无论是在开发新应用还是优化现有应用,合理地使用缓存都是提高性能的有效手段。
13 1
|
9天前
|
设计模式 Java Spring
spring源码设计模式分析(七)-委派模式
spring源码设计模式分析(七)-委派模式
|
9天前
|
设计模式 Java 数据库
spring源码设计模式分析(八)-访问者模式
spring源码设计模式分析(八)-访问者模式
|
6天前
|
XML Java 数据格式
spring复习03,注解配置管理bean
Spring框架中使用注解配置管理bean的方法,包括常用注解的标识组件、扫描组件、基于注解的自动装配以及使用注解后的注意事项,并提供了一个基于注解自动装配的完整示例。
spring复习03,注解配置管理bean
|
9天前
|
XML 存储 Java
Spring-源码深入分析(二)
Spring-源码深入分析(二)
下一篇
无影云桌面