搞懂SpringBean生命周期与依赖注入:你还在为这些热门技术感到困惑吗?Comate插件来帮你解答!

文章目录

    • [1 Comate插件](#1 Comate插件)
    • [2 协助梳理代码框架](#2 协助梳理代码框架)
    • [3 代码解释~发现不一样的东西](#3 代码解释~发现不一样的东西)
    • [4 函数拆分~对不同阶段的函数复用代码拆分](#4 函数拆分~对不同阶段的函数复用代码拆分)
    • [5 函数注释~全选对Bean生命周期类进行注释](#5 函数注释~全选对Bean生命周期类进行注释)
    • [6 文件关联~诠释Bean生命周期Demo](#6 文件关联~诠释Bean生命周期Demo)
    • [7 总体评价~Bean生命周期流程图](#7 总体评价~Bean生命周期流程图)

本文将拿SpringBean生命周期与依赖注入的代码案例进行剥削,进而提高对技术的认知,教你如何使用Baidu Comate插件来逐层剥削,从而搞得SpringBean生命周期与依赖注入的技术。

1 Comate插件

给你分享一个**免费的编码助手------百度Comate!**百度文心大模型,46%采纳率,百度27%的代码都是它写的!AI这个大腿,你确定不抱一下?快来安装使用吧,送京东卡! https://dwz.cn/UVYpt0iX

**文心快码(Baidu Comate)**是一款又好又快的智能代码助手。基于文心大模型,结合百度积累多年的编程现场大数据和外部优秀开源数据,新一代编码辅助工具文心快码拥有代码智能、场景丰富、创造价值、广泛应用等多重产品优势,可实现"帮你想、帮你写、帮你改"的场景应用形态。提升编码效率,释放"十倍"软件生产力。

本文使用IDEA进行项目的开发与解析,Baidu Comate安装插件(具体配置建议根据上方链接进行查看配置,几步很简单,这里就不做过多描述啦):

2 协助梳理代码框架

目前以我往期学习的其中一个父工程和多个子工程项目(各种不同的小Demo融合,考验它的时候到啦~)进行剥削,来验证Baidu Comate的高效性能,从而提高开发的效率。

对于想要开始了解一个新的项目,通常需要先对项目的架构有个初始的认识,但是对于了解代码架构、数据架构等,都会消耗掉大量的时间和精力,从而间接的消磨了对新事物的热情。

使用Baidu Comate可以很好的解决这一个问题,现在Baidu Comate迎来大升级,出现了AI架构师等全新功能,废话不多说,我们正式进入正题吧~

初始想要了解代码的整体架构,可以进入插件点击下方的#知识,出现代码库,选中后,在输入框输入帮我梳理当前代码块架构

得出的效果是,主要有对项目根目录结构分析项目架构梳理建议,其中也有对里面复杂的子模块进行分析,识别出项目的项目特有的资源文件、配置文件或子模块。

由于整体模块比较杂,得出的信息也是比较明确,后续也给出项目架构梳理。

PlayerAPISpringBeanSpringDemo等可能是项目的子模块或包名;menu.txtsales.txtproducts.txt等可能是项目使用的数据文件;而AutoClickerConcurrencyAlgorithmTraining等则可能是项目的特定功能或组件。

美中不足的地方就是,我输入:帮我梳理当前代码库的子代码库SpringDemo架构,似乎不支持解析内部的子代码库。不过给出的建议,已经把项目的基础通用架构进行描述,总体体验不错,可以提高了解代码架构的时间。

当然啦,为什么效果有所不足,因为我是拿众多小项目杂糅在一起来考验Baidu Comate的能力,能有这样的效果,已经很令人满意啦!

3 代码解释~发现不一样的东西

对于代码的解释,我个人个非常喜欢Baidu Comate插件,因为生成的代码解释非常非常的详细,并且会提早告知代码潜在的问题和改进方案(从中可以得到自己代码中可以优化的地方,不小心被Baidu Comate发现啦~),还有额外的扩展实践。

其实有经验的开发者已经意识到,这又是一个大杂烩,哈哈哈哈偷懒被发现啦~

4 函数拆分~对不同阶段的函数复用代码拆分

其实这个Demo的精华就是这一个代码,全选代码,使用代码拆分。

得出来的效果非常满意,因为指令是让它进行代码的拆分,出现的就只有代码,没有其它的冗余,省去了额外阅读其它无关紧要的信息的时间,而且还贴心的把函数注释加上了。

由于我是及其精简的代码,所以拆分的效果不明显,其实对于开发者来说,这也是很简单的事情,只是需要额外的时间拆分,正好Baidu Comate刚刚好解决这些额外时间的花销,大大的提高了开发效率。

java 复制代码
package com.example.springdemo.bean;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

@Component
public class MyBean implements BeanNameAware, BeanFactoryAware,
        ApplicationContextAware, InitializingBean, DisposableBean {
    /**
     * 构造函数
     */
    public MyBean() {
        printMessage("Bean 构造函数调用...");
    }

    /**
     * Bean 初始化
     */
    @PostConstruct
    public void init() {
        printMessage("Bean 初始化...");
    }

    /**
     * Bean 销毁
     */
    @PreDestroy
    public void destroy() {
        printMessage("Bean 销毁...");
    }

    /**
     * 执行任务
     */
    public void performTask() {
        printMessage("Bean 正在执行任务...");
    }

    /**
     * 设置 BeanFactory
     *
     * @param beanFactory BeanFactory 实例
     * @throws BeansException 如果设置 BeanFactory 时发生异常
     */
    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        printMessage("Bean 获得所在BeanFactory引用...");
    }

    /**
     * 设置 Bean 名称
     *
     * @param s Bean 名称
     */
    @Override
    public void setBeanName(String s) {
        printMessage("Bean 名称...");
    }

    /**
     * Bean 属性设置之后的自定义初始化
     *
     * @throws Exception 如果初始化过程中发生异常
     */
    @Override
    public void afterPropertiesSet() throws Exception {
        printMessage("Bean 属性设置之后,自定义的初始化...");
    }

    /**
     * 设置 ApplicationContext
     *
     * @param applicationContext ApplicationContext 实例
     * @throws BeansException 如果设置 ApplicationContext 时发生异常
     */
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        printMessage("Bean 获得所在ApplicationContext引用...");
    }

    /**
     * 打印消息到控制台
     *
     * @param message 要打印的消息
     */
    private void printMessage(String message) {
        System.out.println(message);
    }
}

5 函数注释~全选对Bean生命周期类进行注释

我发现全选加函数注释的效果,结果发现居然只给了类的函数注释,原本以为是给整篇函数一起加注释呢?

个人建议:希望官方可以把指令改一下,改为其它名称,或者在类的左边也加一个快捷的小按钮。(当然啦,这是我个人的编码习惯,不一定符合大众哈哈哈)

6 文件关联~诠释Bean生命周期Demo

点击知识里面的文件,或者直接输入#调用知识指令,然后点击里面文件,这里我选择与代码有关的3个文件,由于提示词的原因,他们停留类的层面进行对比关联。

此时我输入#MyBean.java #AppConfig.java #SpringDemoApplication.java 他们之间Bean生命周期是怎么关联的?

生成的部分效果(直接读取每一个文件的内容进行分析):

Bea生命周期的关联

  1. 启动Spring Boot应用 :当你运行SpringDemoApplicationmain方法时,Spring Boot会启动并创建一个Spring应用上下文(ApplicationContext)。
  2. 组件扫描 :Spring会根据@ComponentScan注解指定的包路径进行组件扫描,找到所有带有@Component@Service@Repository等注解的类,以及@Configuration注解的配置类。
  3. 注册Bean :在扫描过程中,Spring会识别AppConfig类为一个配置类,并调用其@Bean注解的方法(如myBeanDemo()),将返回的MyBean实例注册为Spring容器中的一个Bean。
  4. Bean生命周期回调
    • 构造函数 :首先调用MyBean的构造函数。
    • BeanNameAware :如果Bean实现了BeanNameAware接口,Spring会调用setBeanName方法,将Bean的名称传递给Bean。
    • BeanFactoryAware :如果Bean实现了BeanFactoryAware接口,Spring会调用setBeanFactory方法,将BeanFactory的引用传递给Bean。
    • ApplicationContextAware :如果Bean实现了ApplicationContextAware接口,Spring会调用setApplicationContext方法,将ApplicationContext的引用传递给Bean。
    • @PostConstruct :如果Bean上有@PostConstruct注解的方法,Spring会在所有依赖注入完成后调用这个方法。
    • InitializingBean :如果Bean实现了InitializingBean接口,Spring会调用afterPropertiesSet方法。注意,如果同时使用了@PostConstruct注解,则@PostConstruct注解的方法会在afterPropertiesSet方法之前调用。
    • Bean的使用:此时,Bean已经准备好被应用中的其他部分使用。
    • @PreDestroy :当Spring容器关闭时(例如,应用停止时),如果Bean上有@PreDestroy注解的方法,Spring会调用这个方法,允许Bean执行清理操作。
    • DisposableBean :如果Bean实现了DisposableBean接口,Spring还会调用destroy方法。但是,通常建议使用@PreDestroy注解而不是实现DisposableBean接口,因为@PreDestroy注解的方式更加简洁。

综上所述,MyBeanAppConfigSpringDemoApplication之间的Bean生命周期关联是通过Spring的容器管理和依赖注入机制实现的。SpringDemoApplication启动Spring应用上下文,AppConfig通过@Bean注解声明Bean,而MyBean则通过实现特定的接口和注解来参与Bean的生命周期管理。

总体来说,Baidu Comate把文件里的代码详细解释了一遍,并且里面已经解释好了Bean声明周期和依赖注入在不同时期的顺序关系,与上图的运行截图打印的顺序一致。

7 总体评价~Bean生命周期流程图

使用Baidu Comate生成简化的Bean生命周期流程图,将Bean的生命周期流程都得以展示,并且比代码里面的步骤详细一点,很清晰的表达了Bean的生命周期。

由于上次测评过相关的功能,这里就不一一测试啦,感兴趣的博主可以观看我这一篇博文,希望对你们有所帮助~

突破编程界限:探索AI编程新境界_comate和通义灵码-CSDN博客

为什么标题为7,因为今天七夕呀,祝友友们七夕快乐呀,我学习快乐呀~

相关推荐
Theodore_10222 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
小陈phd3 小时前
OpenCV从入门到精通实战(九)——基于dlib的疲劳监测 ear计算
人工智能·opencv·计算机视觉
冰帝海岸3 小时前
01-spring security认证笔记
java·笔记·spring
世间万物皆对象4 小时前
Spring Boot核心概念:日志管理
java·spring boot·单元测试
Guofu_Liao4 小时前
大语言模型---LoRA简介;LoRA的优势;LoRA训练步骤;总结
人工智能·语言模型·自然语言处理·矩阵·llama
没书读了4 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring
小二·4 小时前
java基础面试题笔记(基础篇)
java·笔记·python
开心工作室_kaic5 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
懒洋洋大魔王5 小时前
RocketMQ的使⽤
java·rocketmq·java-rocketmq
武子康5 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud