实战讲解及分析Spring新建Bean的几种方式以及创建过程(图+文+源码)

这篇具有很好参考价值的文章主要介绍了实战讲解及分析Spring新建Bean的几种方式以及创建过程(图+文+源码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 缘起

作为一个应用开发人员而言,会使用某一个工具分为两个层次(个人观点):
第一个层次,知道工具,会使用这个工具解决问题;
第二个层次,理解工具的实现原理。
关于Spring的学习,还在第一个层次转悠,缺少原理的研究,
随着学习的深入,开始研究些Spring源码,配合IDEA调试,
逐渐理解一些Spring原理,先从创建Bean开始,
分享如下。

2 新建Bean

对于Spring学习、使用和研究人员而言,
Bean必修课,Bean从何而来,又如何获取,
弄清楚这些,会加深对Spring的理解。
首先从创建Bean开始,常见的创建方式有3种:

  • 注解@Bean方式
  • XML方式
  • BeanDefinitionBuilder方式

通过XML实现的Bean注入有多种方式:构造方法注入、set方法注入、静态工厂注入和实例工厂注入

Spring提供了多种方式创建Bean,这里的创建Bean是创建自定义的Bean,
不涉及Spring启动时需要创建的系统Bean,
但是殊途同归,最终都是通过BeanDefinition构建Bean,
创建自定义的Bean会经历两个核心步骤:

  • 注册BeanDefinition
    填充beanDefinitionMap和beanDefiinitionNames,为填充singletonObjects准备
  • 创建单例Bean
    填充singletonObjects,供后续获取Bean使用

2.1 @Bean方式

通过@Bean方式创建自定义Bean是最明显的方式,
直接在对应的方法上添加@Bean注解,表明这是Bean,
结合@Configuration,Spring会自动创建Bean,
测试样例及注释如下:

package com.monkey.springboottemplate.modules.bean_definition;

import com.monkey.springboottemplate.common.entity.UserEntity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 注解新建Bean.
 *
 * @author xindaqi
 * @since 2022-12-14 16:01
 */
@Configuration
public class BeanDefinitionByAnnotation {
    private static final Logger logger = LoggerFactory.getLogger(BeanDefinitionByAnnotation.class);
    @Bean
    public UserEntity myUserBean() {
        return new UserEntity("xiaohua", "欧洲");
    }
    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
        // 注册BeanDefinition
        applicationContext.register(BeanDefinitionByAnnotation.class);
        // 加载或刷新配置(Java基础配置/XML/properties等)的持久化描述,
        // 这里关注填充singletonObjects
        applicationContext.refresh();
        logger.info(">>>>>>>>>>应用程序上下文启动");
        UserEntity user = applicationContext.getBean(UserEntity.class);
        logger.info(">>>>>>>>Bean:{}", user);
        applicationContext.close();
        logger.info(">>>>>>>>关闭应用程序上下文");
    }
}

2.2 XML方式

通过XML创建Bean,首先要构建对应的XML文件,

2.2.1 set方法注入

配置样例及注释如下:

<?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:context="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 http://www.springframework.org/schema/context/spring-context.xsd">
    <!-- 在Spring framework中启用@Resource注解 -->
    <context:annotation-config />
    <!-- 构建User Bean实例:Bean id为user1 -->
    <bean id="userA" class="com.monkey.springboottemplate.common.entity.UserEntity">
        <property name="nickname" value="xiaoxml" />
        <property name="address" value="欧洲" />
    </bean>
</beans>

2.2.2 构造器注入

配置样例及注释如下:

<?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:context="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 http://www.springframework.org/schema/context/spring-context.xsd">
    <!-- 在Spring framework中启用@Resource注解 -->
    <context:annotation-config />
    <!-- 构建User Bean实例:Bean id为user1 -->
    <bean id="userA" class="com.monkey.springboottemplate.common.entity.UserEntity">
        <constructor-arg name="nickname" value="xiaoxml" />
        <constructor-arg name="address" value="欧洲" />
    </bean>
</beans>

2.2.3 静态工厂注入

package com.monkey.springboottemplate.common.entity;

/**
 * User工厂.
 *
 * @author xindaqi
 * @since 2023-04-08 15:26
 */
public class UserFactory {
    
    public static UserEntity getUserA() {
        return new UserEntity("A", "China");
    }
}

配置样例及注释如下:

<?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:context="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 http://www.springframework.org/schema/context/spring-context.xsd">
    <!-- 在Spring framework中启用@Resource注解 -->
    <context:annotation-config />
    <!-- 构建User Bean实例:Bean id为user1 -->
    <bean id="userA" class="com.monkey.springboottemplate.common.entity.UserFactory" factroy-method="getUserA"/>
</beans>

2.2.4 实例工厂注入

package com.monkey.springboottemplate.common.entity;

/**
 * User工厂.
 *
 * @author xindaqi
 * @since 2023-04-08 15:26
 */
public class UserFactory {
    
    public String getName() {
        return "A";
    }
    
    public String getAddress() {
        return "China";
    }
}

配置样例及注释如下:

<?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:context="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 http://www.springframework.org/schema/context/spring-context.xsd">
    <!-- 在Spring framework中启用@Resource注解 -->
    <context:annotation-config />
    <!-- 构建UserFactory实例:供后续调用 -->
    <bean id="userFactroy" class="com.monkey.springboottemplate.common.entity.UserFactory"/>
        
    <bean id="name" factory-bean="userFactory" factory-method="getName"/>
    <bean id="address" factory-bean="userFactory" factory-method="getAddress"/>
</beans>

XML文件只是存储Bean的持久化配置文件,
想要使该Bean加载到Spring容器,仍需要通过相关类加载该XML文件,
测试样例以及注释如下:

package com.monkey.springboottemplate.modules.bean_definition;

import com.monkey.springboottemplate.common.entity.UserEntity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * XML新建Bean.
 *
 * @author xindaqi
 * @since 2022-12-14 15:59
 */
public class BeanDefinitionByXml {
    private static final Logger logger = LoggerFactory.getLogger(BeanDefinitionByXml.class);
    public static void main(String[] args) {
        String beanConfig = "bean-creation.xml";
        // 通过XML配置文件构建Bean
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext(beanConfig);
        UserEntity user = applicationContext.getBean("userA", UserEntity.class);
        logger.info(">>>>>>>>Creation Bean using XML, User Bean :{}", user);
    }
}

2.3 BeanDefinition

上面两种创建Bean的方式对于应用开发者而言是显式的,
而,更贴近Spring底层的方式是通过BeanDefinition创建Bean,
Spring创建Bean的第一个过程即注册BeanDefinition,就是下面的样例,
通过显式的方式注册BeanDefinition,
然后再创建单例的Bean,测试样例及注释如下:

package com.monkey.springboottemplate.modules.bean_definition;

import com.monkey.springboottemplate.common.entity.UserEntity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * BeanDefinition新建Bean.
 *
 * @author xindaqi
 * @since 2022-12-14 16:01
 */
public class BeanDefinitionByBuilder {
    private static final Logger logger = LoggerFactory.getLogger(BeanDefinitionByBuilder.class);
    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
        // 构建BeanDefinition,填充Bean属性
        BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(UserEntity.class);
        beanDefinitionBuilder.addPropertyValue("nickname", "xiaoxiao");
        AbstractBeanDefinition beanDefinition = beanDefinitionBuilder.getBeanDefinition();
        // 注册BeanDefinition
        applicationContext.registerBeanDefinition("myBean", beanDefinition);
        // 加载或刷新配置(Java基础配置/XML/properties等)的持久化描述,
        // 这里关注填充singletonObjects
        applicationContext.refresh();
        logger.info(">>>>>>>>>>应用程序上下文启动");
        UserEntity user1 = applicationContext.getBean(UserEntity.class);
        UserEntity user2 = (UserEntity) applicationContext.getBean("myBean");
        logger.info(">>>>>>>>>>User:{}, user2:{}", user1, user2);
        applicationContext.close();
        logger.info(">>>>>>>>关闭应用程序上下文");
    }
}

3 源码分析

3.1 创建Bean流程

Spring中创建自定义Bean的核心流程如下图所示,
由图可知,创建自定义Bean分成两个部分:

  • 注册BeanDefition
  • 注册Bean

核心都是填充对应的数据结构,
最终把Bean添加到Spring构建的Bean容器中,供后续取用。
虽然干巴巴流程太流于表面,没有质感,但是,这些使用源码中抠出来的
虽然散,但是,易于理解和记忆,
后面会详细给出流程的源码及源码分析。
实战讲解及分析Spring新建Bean的几种方式以及创建过程(图+文+源码)

3.2 BeanDefinition相关

先从注册BeanDefinition开始分析,
BeanDefiniton,从命名即可知,是Bean的定义,用于描述Bean,
Spring将BeanDefinition设计为一个interface,面向接口,
BeanDefinition源码长这样,如下图所示,
这里仅需要知道BeanDefinition是用于描述Bean的即可,
会在其他文章详细讲解BeanDefinition。
实战讲解及分析Spring新建Bean的几种方式以及创建过程(图+文+源码)
为什么要注册BeanDefinition?
因为BeanDefinition用于描述Bean实例,因此,创建Bean的时候需要先注册BeanDefition,描述Bean,然后再创建Bean,两者是关联的。
注册BeanDefinition的核心是填充beanDefinitionMap和beanDefinitionNames。

  • beanDefinitionMap
    位置:org.springframework.beans.factory.support.DefaultListableBeanFactory#beanDefinitionMap
    源码如下图所示,由注释可知,beanDefinitionMap用于存储bean名称和beanDefintion,所谓的关联关系就在这里,(key, value)->(beanName, beanDefinition),为后续通过beanName获取beanDefinition做准备。
    实战讲解及分析Spring新建Bean的几种方式以及创建过程(图+文+源码)

  • beanDefinitionNames
    位置:org.springframework.beans.factory.support.DefaultListableBeanFactory#beanDefinitionNames
    源码如下图所示,由注释可知,beanDefintionNames存储Bean名称,为后续填充singletonObjects做准备。
    实战讲解及分析Spring新建Bean的几种方式以及创建过程(图+文+源码)

3.2.1 流程

前置知识已介绍,下面进入正题,讲解流程。
源码调试流程如下图所示,感兴趣的可以参照流程图中打断点调试。
实战讲解及分析Spring新建Bean的几种方式以及创建过程(图+文+源码)

(1)AnnotationConfigApplicationContext中注册BeanDefinition:registerBeanDefinition
(2)GenericApplicationContext中注册BeanDefinition:registerBeanDefinition
(3)DefaultListableBeanFactory中注册BeanDefinition:registerBeanDefinition
(4)DefaultListableBeanFactory中填充beanDefinitionMap:beanDefinitionMap.put
(5)DefaultListableBeanFactory中填充beanDefinitionNames:beanDefinitionNames.add

3.2.2 源码调试过程

3.2.2.1 AnnotationConfigApplicationContext中注册BeanDefinition:registerBeanDefinition

实战讲解及分析Spring新建Bean的几种方式以及创建过程(图+文+源码)

3.2.2.2 GenericApplicationContext中注册BeanDefinition:registerBeanDefinition

实战讲解及分析Spring新建Bean的几种方式以及创建过程(图+文+源码)

3.2.2.3 DefaultListableBeanFactory中注册BeanDefinition:registerBeanDefinition

实战讲解及分析Spring新建Bean的几种方式以及创建过程(图+文+源码)

3.2.2.4 DefaultListableBeanFactory中填充beanDefinitionMap:beanDefinitionMap.put &
3.2.2.5 DefaultListableBeanFactory中填充beanDefinitionNames:beanDefinitionNames.add

合并步骤4和5,填充对应的数据。
实战讲解及分析Spring新建Bean的几种方式以及创建过程(图+文+源码)

3.3 Bean相关

完成上面的准备工作,接下来就要创建Bean,
这个Bean实际单例对象,在singletonObjects中存储,为后面获取Bean做准备。
singletonObjects:
位置:org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#singletonObjects
源码如下图所示,由注释可知,singletonObjects缓存单例Bean实例。
实战讲解及分析Spring新建Bean的几种方式以及创建过程(图+文+源码)

3.3.1 流程

下面开始讲解如何填充这个Map,
源码调试流程如下图所示,感兴趣的可以参照流程图中打断点调试。
实战讲解及分析Spring新建Bean的几种方式以及创建过程(图+文+源码)

(1)AnnotationConfigApplicationContext中刷新相关的Bean:refresh
(2)同步锁,AbstractApplicationContext中刷新相关Bean:refresh
(3)结束BeanFactory初始化,AbstractApplicationContext初始化的最后一步,完成准备工作之后,需要固化相关的操作:finishBeanFactoryInitialization
(4)预处理,DefaultListableBeanFactory实例化单体Bean:preInstantiateSingletons
(5)获取Bean,AbstractBeanFactory根据Bean名称获取Bean:getBean(java.lang.String)
(6)获取Bean,AbstractBeanFactory获取Bean:doGetBean
(7)获取单例Bean,DefaultSingletonBeanRegistry根据Bean名称获取单例Bean:getSingleton(java.lang.String, org.springframework.beans.factory.ObjectFactory<?>)
(8)添加单例Bean,DefaultSingletonBeanRegistry添加单例Bean:addSingleton
(9)添加Bean,DefaultSingletonBeanRegistry:singletonObjects.put

3.3.2 源码调试过程

3.3.2.1 AnnotationConfigApplicationContext中刷新相关的Bean:refresh

实战讲解及分析Spring新建Bean的几种方式以及创建过程(图+文+源码)

3.3.2.2 同步锁,AbstractApplicationContext中刷新相关Bean:refresh

实战讲解及分析Spring新建Bean的几种方式以及创建过程(图+文+源码)

3.3.2.3 结束BeanFactory初始化,AbstractApplicationContext初始化的最后一步,完成准备工作之后,需要固化相关的操作:finishBeanFactoryInitialization

实战讲解及分析Spring新建Bean的几种方式以及创建过程(图+文+源码)

3.3.2.4 预处理,DefaultListableBeanFactory实例化单体Bean:preInstantiateSingletons

实战讲解及分析Spring新建Bean的几种方式以及创建过程(图+文+源码)
实战讲解及分析Spring新建Bean的几种方式以及创建过程(图+文+源码)

3.3.2.5 获取Bean,AbstractBeanFactory根据Bean名称获取Bean:getBean(java.lang.String)

实战讲解及分析Spring新建Bean的几种方式以及创建过程(图+文+源码)

实战讲解及分析Spring新建Bean的几种方式以及创建过程(图+文+源码)

3.3.2.6 获取Bean,AbstractBeanFactory获取Bean:doGetBean

实战讲解及分析Spring新建Bean的几种方式以及创建过程(图+文+源码)

实战讲解及分析Spring新建Bean的几种方式以及创建过程(图+文+源码)

3.3.2.7 获取单例Bean,DefaultSingletonBeanRegistry根据Bean名称获取单例Bean:getSingleton(java.lang.String, org.springframework.beans.factory.ObjectFactory<?>)

实战讲解及分析Spring新建Bean的几种方式以及创建过程(图+文+源码)

实战讲解及分析Spring新建Bean的几种方式以及创建过程(图+文+源码)

3.3.2.8 添加单例Bean,DefaultSingletonBeanRegistry添加单例Bean:addSingleton

实战讲解及分析Spring新建Bean的几种方式以及创建过程(图+文+源码)

实战讲解及分析Spring新建Bean的几种方式以及创建过程(图+文+源码)

3.3.2.9 添加Bean,DefaultSingletonBeanRegistry:singletonObjects.put

实战讲解及分析Spring新建Bean的几种方式以及创建过程(图+文+源码)
实战讲解及分析Spring新建Bean的几种方式以及创建过程(图+文+源码)

3.4 获取Bean

通过上面的准备工作,填充了相关的数据,
下面可以通过应用上下文获取Bean。

3.4.1 流程

源码调试流程如下图所示,感兴趣的可以参照流程图中打断点调试。
实战讲解及分析Spring新建Bean的几种方式以及创建过程(图+文+源码)

(1)获取Bean,AnnotationConfigApplicationContext:getBean
(2)获取Bean,AbstractApplicationContext:getBean(java.lang.String)
(3)获取Bean,AbstractBeanFactory:getBean(java.lang.String)
(4)处理逻辑,获取Bean,AbstractBeanFactory:doGetBean
(5)从填充的singletonObjects获取Bean,DefaultSingletonBeanRegistry:getSingleton(java.lang.String)
(6)获取Bean,得到查询的Bean,DefaultSingletonBeanRegistry:getSingleton(java.lang.String, boolean)

3.4.2 源码调试

3.4.2.1 获取Bean,AnnotationConfigApplicationContext:getBean

实战讲解及分析Spring新建Bean的几种方式以及创建过程(图+文+源码)

3.4.2.2 获取Bean,AbstractApplicationContext:getBean(java.lang.String)

实战讲解及分析Spring新建Bean的几种方式以及创建过程(图+文+源码)

3.4.2.3 获取Bean,AbstractBeanFactory:getBean(java.lang.String)

实战讲解及分析Spring新建Bean的几种方式以及创建过程(图+文+源码)

3.4.2.4 处理逻辑,获取Bean,AbstractBeanFactory:doGetBean

实战讲解及分析Spring新建Bean的几种方式以及创建过程(图+文+源码)

3.4.2.5 从填充的singletonObjects获取Bean,DefaultSingletonBeanRegistry:getSingleton(java.lang.String)

实战讲解及分析Spring新建Bean的几种方式以及创建过程(图+文+源码)

3.4.2.6 获取Bean,得到查询的Bean,DefaultSingletonBeanRegistry:getSingleton(java.lang.String, boolean)

实战讲解及分析Spring新建Bean的几种方式以及创建过程(图+文+源码)
最终返回查到的Bean。
实战讲解及分析Spring新建Bean的几种方式以及创建过程(图+文+源码)

4 小结

(1)新建Bean的三种方式:XML、@Bean和BeanDefinition;
(2)创建Bean的核心过程:
(2.1)注册BeanDefinition,填充beanDefinitionMap和beanDefinitionNames;
(2.2)注册Bean,填充singletonObjects;
(3)通过应用上下文获取Bean,是通过singletonObjects查询获取。文章来源地址https://www.toymoban.com/news/detail-400024.html

到了这里,关于实战讲解及分析Spring新建Bean的几种方式以及创建过程(图+文+源码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • spring boot 权限管理的几种方式

    Spring Boot 提供了多种权限管理方式,以下是几种常见的方法,以及相应的示例: 基于角色的访问控制(Role-Based Access Control,RBAC) 在基于角色的访问控制中,权限分配给角色,然后将角色分配给用户。这种方法简化了权限管理,因为您只需要管理角色和用户之间的关系。 示

    2024年02月15日
    浏览(35)
  • 探究Spring Boot 中实现跨域的几种方式

    在现代Web应用中,由于安全性和隐私的考虑,浏览器限制了从一个域向另一个域发起的跨域HTTP请求。解决这个问题的一种常见方式是实现跨域资源共享(CORS)。Spring Boot提供了多种方式来处理跨域请求,本文将介绍其中的几种方法。 Spring Boot提供了一个注解 @CrossOrigin ,可以

    2024年02月05日
    浏览(31)
  • 在Spring Boot项目中连接SQL Server的几种方式

    摘要:连接SQL Server是许多Spring Boot项目中常见的需求之一。本篇博客将介绍在Spring Boot项目中配置连接SQL Server的几种方式,并提供相应的依赖和YAML配置示例,帮助开发者轻松地实现数据库连接。 这是官方提供的JDBC驱动,可以直接通过JDBC URL连接SQL Server数据库。 在项目的po

    2024年02月09日
    浏览(33)
  • Spring Boot中操作数据库的几种并发事务方式

    当有多个 并发 事务时,会发生丢失更新异常。来自一个或多个 事务 的更新可能会丢失,因为其他事务会用其结果覆盖它。 让我们通过一个例子来检验一下。考虑以下执行事务的方法。 public void withdraw(Long accountId, double amount) { Account account = accountRepository.findById(accountId).orEl

    2024年01月22日
    浏览(38)
  • 【Spring】1、Spring 框架的基本使用【读取配置文件、IoC、依赖注入的几种方式、FactoryBean】

    Spring 框架可以说是 Java 开发中最重要的框架,功能 非常 强大 中文文档:https://springdoc.cn/spring/ 官网:https://spring.io/ Spring makes Java Simple、modern、productive … Spring 框架的几个核心概念: IoC: I nversion o f C ontrol:控制反转 DI: D ependency I njection:依赖注入 AOP: A spect O riented P rogram

    2024年02月09日
    浏览(33)
  • 【Spring Cloud系列】- 分布式系统中实现幂等性的几种方式

    在开发订单系统时,我们常遇见支付问题,既用户购买商品后支付,支付扣款成功,但是返回结果的时候网络异常,此时钱已经扣了,用户再次点击按钮,此时会进行第二次扣款,返回结果成功,用户查询余额发现多扣钱了,流水记录也变成了两条。在以前的单应用系统中,

    2024年02月10日
    浏览(31)
  • 设置JdbcTemplate打印sql语句的几种实现方式使用Spring Boot打印SQL语句

    在使用JdbcTemplate执行SQL查询时,可以将其配置为打印SQL语句,以便调试和优化查询。以下是一些方法可以设置JdbcTemplate打印SQL语句: 如果你使用Log4j作为日志框架,可以在log4j.properties或log4j.xml文件中添加以下配置,将JdbcTemplate打印的SQL语句输出到控制台或日志文件中: 这将

    2024年02月15日
    浏览(121)
  • SpringBoot中有几种定义Bean的方式?

    注意:@ControllerAdvice相当于对于Controller的切面,可以绑定PropertyEditor。 (类似于AOP,但是底层不是AOP实现。) 注意:@Configuration 主要标识一个Bean是一个配置Bean,利用这个Bean可以对Spring进行配置,比如扫描路径、定义其他的Bean。 这是我们其他所有方法的底层实现。 MyApplic

    2024年02月02日
    浏览(29)
  • 串口监控的几种方式

    目录 方法1. 使用usb转TTL模块硬件监控; 方法2. 使用JLINK的SWD接口的串口收发脚进行硬件监控; 方法3. 使用虚拟串口进行软件监控; 方法1. 使用usb转TTL模块硬件监控; 方法2. 使用JLINK的SWD接口的串口收发脚进行硬件监控; 吃水不忘挖井人: Jlink v9虚拟串口功能,不用再单独购

    2024年02月06日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包