Spring执行流程和Bean的生命周期详解

 更新时间:2023年06月19日 09:58:40   作者:bushi橙子  
这篇文章主要介绍了Spring执行流程和Bean的生命周期详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

1、Spring执行流程

Spring执行流程(Bean执行流程):1、在启动类中遇到了ApplicationContext的时候就会启动 Spring 容器 -> 2、根据容器设置的配置文件,去找相应的配置文件; ->3、如果有base-package,那么就去base-package里循环找所有的类,看有没有五大类注解和方法注解; ->4、 如果有注解,进行初始化和属性依赖赋值

2、Bean的生命周期(重点)

所谓生命周期是指一个对象从创建到销毁的过程。

Bean的生命周期可分为以下5大部分:

1.实例化Bean:为Bean分配空间

2.**设置属性:**为Bean注入属性和装配属性

3.Bean初始化:

  • 实现各种通知方法:BeanNameAware、BeanFactoryAware、ApplicationContextAware的接口方法。
  • 执行前置方法(BeanPostProcessor接口)
  • 执行初始化方法(设置了才会执行)
    • 注解方式:@PostConstruct,依赖注入后被执行(优先级高,主流方式)
    • xml方式:init-method ⽅法
  • 执行后置方法(BeanPostProcessor接口)

4.使用Bean

5.销毁Bean:@PreDestroy、DisposableBean 接⼝⽅法、destroy-method。

图示化流程:

伪代码流程(xml方式):

public class BeanLife implements BeanNameAware, BeanFactoryAware, BeanPostProcessor {
    /*
        各种通知
     */
    @Override
    public void setBeanName(String s) {
        //s 是设置的Bean名称
        System.out.println("执行了通知:BeanNameAware - > BeanName = "+s);
    }
    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("执行了通知:BeanFactoryAware");
    }
    /*
        前置方法 :默认情况不会显式调用
     */
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("执行了前置方法:postProcessBeforeInitialization");
        return bean;
    }
    /*
        初始化
     */
    public void myInit(){
        System.out.println("执行了xml方式的初始化 - > init-method");
    }
    @PostConstruct
    public void doPostConstruct(){
        System.out.println("执行了注解的初始化 - > PostConstruct");
    }
    /*
        后置方法 :默认情况不会显式调用
     */
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("执行了后置方法:postProcessAfterInitialization");
        return bean;
    }
    //使用Bean
    public void sayHi(){
        System.out.println("使用Bean -> sayHi()");
    }
    /*
        销毁方法
     */
    @PreDestroy
    public void doPreDestroy(){
        System.out.println("执行了销毁方法:PreDestroy");
    }
}

前置方法和后置方法: 默认不会显式调用

​ 1.可以把作用域改为prototype

xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:content="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    <bean id="beanLife" class="com.spring.demo.BeanLife" scope="prototype" init-method="myInit"></bean>
</beans>

启动类:

public class App {
    public static void main(String[] args) {
        //此处使用ClassPathXmlApplicationContext,因为ApplicationContext没有销毁方法
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.config.xml");
        BeanLife beanLife = context.getBean("beanLife",BeanLife.class);
       //使用bean
        beanLife.sayHi();
        //销毁容器(bean也就销毁了)
        context.destroy();
    }
}

执行结果:

2.1、实例化和初始化的区别

实例化和属性设置是java级别的系统“事件”,其操作过程不可人为干预和修改;而初始化是给开发者提供的,可以在实例化之后,类加载完成之前进行自定义“事件”处理。

2.2、为什么先设置属性再进行初始化呢?

因为在初始化阶段可能会用到bean的属性和方法;如果不先设置属性,先初始化,那么在初始化阶段使用属性,就报错了;因为属性此时还没装配呢。

@Controller
public class BController {
    @Autowired
    private User user1;//设置属性
    @PostConstruct//初始化
    public void say(){
        //再初始化中使用了user1里的属性
        System.out.println(user1.toString());
    }
}
vate User user1;//设置属性
    @PostConstruct//初始化
    public void say(){
        //再初始化中使用了user1里的属性
        System.out.println(user1.toString());
    }
}

到此这篇关于Spring执行流程和Bean的生命周期的文章就介绍到这了,更多相关Spring Bean生命周期内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring Data JPA使用Sort进行排序(Using Sort)

    Spring Data JPA使用Sort进行排序(Using Sort)

    本篇文章主要介绍了Spring Data JPA使用Sort进行排序(Using Sort),具有一定的参考价值,有兴趣的可以了解一下
    2017-07-07
  • java控制台实现可视化日历小程序

    java控制台实现可视化日历小程序

    这篇文章主要为大家详细介绍了java控制台实现可视化日历小程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • Java实现商品的查找、添加、出库、入库操作完整案例

    Java实现商品的查找、添加、出库、入库操作完整案例

    这篇文章主要介绍了Java实现商品的查找、添加、出库、入库操作,结合完整实例形式分析了java基于面向对象的商品信息添加、删除、查找等相关操作技巧,需要的朋友可以参考下
    2019-11-11
  • jenkins和sonar实现代码检测过程详解

    jenkins和sonar实现代码检测过程详解

    这篇文章主要介绍了jenkins和sonar实现代码检测过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • java使用dom4j操作xml示例代码

    java使用dom4j操作xml示例代码

    dom4j是一个Java的XML API,类似于jdom,用来读写XML文件,下面我来个小例子学习他的使用方法
    2013-11-11
  • springboot使用kafka推送数据到服务端的操作方法带认证

    springboot使用kafka推送数据到服务端的操作方法带认证

    在使用Kafka进行数据推送时,遇到认证问题导致连接失败,本文详细介绍了Kafka的认证配置过程,包括配置文件的引入和参数设置,实际测试表明,需要正确配置sasl.jaas.config以及其他认证参数,探讨了配置文件是否可以同时存在多个配置块的可能性,并提出了实际操作中的注意事项
    2024-11-11
  • SpringMVC中日期格式的转换

    SpringMVC中日期格式的转换

    本文主要介绍了SpringMVC中日期格式转换的相关知识:用来解决日期提交转换异常的问题。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • Spring AOP访问目标方法的参数操作示例

    Spring AOP访问目标方法的参数操作示例

    这篇文章主要介绍了Spring AOP访问目标方法的参数操作,结合实例形式详细分析了spring面向切面AOP访问目标方法的参数相关实现步骤与操作注意事项,需要的朋友可以参考下
    2020-01-01
  • Java二叉树中LCA问题解决方法两则

    Java二叉树中LCA问题解决方法两则

    这篇文章主要介绍了Java二叉树中LCA问题解决方法,总的来说这并不是一道难题,那为什么要拿出这道题介绍?拿出这道题真正想要传达的是解题的思路,以及不断优化探寻最优解的过程。希望通过这道题能给你带来一种解题优化的思路
    2022-12-12
  • 如何使用两个栈实现队列Java

    如何使用两个栈实现队列Java

    这篇文章主要介绍了如何使用两个栈实现队列Java,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11

最新评论