第一篇博客文章从spring的bean生命周期开始吧!!
在介绍spring的bean生命周期之前,大家应该都了解java的整个框架的发展历史。这里给大家简单回顾一下:
- strust(struts实现了mvc模式,支持i18,数据库连接池,提供了异常支持机制的支持。对于struts1来说action是单实例的,因此在action的变量有可能会出现不安全的问题,struts2来说action是线程安全的。并且struts框架也在实践方案中频频爆出安全漏洞问题,所以对于spring的流行也起到了一定推波助澜的作用,当然spring框架不止于此!)
- spring(spring框架很好的为开发者提供了几大核心模块:core核心ioc,aop,orm,dao,web,jms,事务等等。其中最经典的当属ioc和aop,这两样核心技术让java的bean可以再运行时加载进上下文中,可以按照运行需要初始化类。实现了控制反转同时aop实现了面向切面编程解耦和的作用。)
- springboot(springboot是对spring的一些模块的整合,有利于实现快速开发的目的。利用@conditional的组合注解实现springboot的自动化配置实现,这里就不做过多阐述,以后有机会单独展示其魅力。springboot解决了spring整合三方模块时需要的繁琐的xml配置,利用@configuration和@bean注解实现配置的代码化,减少xml的配置,还有jar包的引入利用整合的依赖完美解决jar包冲突问题。)
- springcloud(是在springboot的基础上实现的微服务的架构理念。整合了从网关,断路器,负载均衡,注册中心,统一配置的全家桶概念实现。可以开箱即用,结合配置文件的配置保证微服务的正常运行,避免大面积的故障运维事故。)
- dubbo(这个其实和springcloud一样可以实现 微服务的架构,但是缺点在于在和三方的配合使用,并没有整合三方的应用在一起达到开箱即用。优势主要是利用rpc框架实现,通信利用netty的异步通信机制。可以接入多种通信协议,而springcloud则只能接受rest api风的http请求。)
- ServiceMesh(ServiceMesh通过全局控制层控制服务与服务之间的调用关系,服务的治理策略。对于服务本身来说,只需要站在单机的维度考虑上游服务的依赖通信,采用简单的通信协议例如HTTP,gRPC等。Mesh层透明的发现上游目标,进行重试/超时、监控、追踪。为单机服务赋予分布式系统能力。当下很多企业都在使用这种模式。)
前面说这么多扯远了,回到正题,spring的bean生命周期:
spring框架的两大核心模块主要是ioc和aop。而bean对象的实例化过程也就发生在ioc的容器中,现在一一到来。
1.bean的预初始化:spring通过反射机制实现bean的构造器还有属性的注入。首先spring货通过BeanNameAware的setBeanName()方法根据传入bean实例的id传递给setBeanName()保存一个beanname字段。当实现BeanNameAware类的接口会通过BeanFactory实现setBeanFactory()方法,利用BeanFactory管理bean。
2.bean初始化:通过BeanPostProcessor类完成bean初始化的前置处理和后置处理。 如果我们想在Spring容器中完成bean实例化、配置以及其他初始化方法前后要添加一些自己逻辑处理。我们需要定义一个或多个BeanPostProcessor接口实现类,然后注册到Spring IoC容器中。
3.bean的使用:此时有关Bean的所有准备工作均已完成,Bean可以被程序使用了,它们将会一直驻留在应用上下文中,直到该上下文环境被销毁。
4.bean的销毁:如果Bean实现了DisposableBean接口,Spring将会在Bean实例销毁之前调用该接口的destory()方法,来完成一些销毁之前的处理工作。
(尽量使用配置文件销毁降低耦合性:自定义的destory-method指定的方法:如果在配置文件中使用destory-method指定了销毁方法,那么在Bean实例销毁之前会调用该指定的方法完成一些销毁之前的理工作。)
最后贴一副bean生命周期的流程图以助于理解: