基于注解的Spring(IOC+AOP)

文章详细介绍了Spring框架中的核心概念IOC和AOP,解释了它们的区别和作用,展示了如何使用注解进行对象管理和依赖注入。此外,还涵盖了Spring与MyBatis的注解整合,包括@MapperScan和XML配置的底层原理。最后提到了基于注解的AOP实现,包括JDK动态代理和CGLIB代理。
摘要由CSDN通过智能技术生成

目录

这是基于黑马Spring的笔记

写再前面

开始

 @Component(value=bean的名称) 

componet衍生出的3个注解

Bean内部的属性进行注入

非自定义的Bean管理

使用配置类完全替代XML配置文件

 配置类中的注解

spring中的其他注解(偶尔会用到)

 Spring注解的解析原理

spring使用注解整合第三方框架mybatis

XML和@Mapperscan注解整合Mybatis的底层原理:

@import整合第三方框架

基于注解的AOP


写再前面

IOC和AOP都是面向切面编程(Aspect-Oriented Programming)的实现方法。

它们提供了一种抽象机制,可以实现在程序运行期动态地将额外功能插件到现有代码中。

IOC全称是Inversion of Control,即控制反转。它是Spring框架的核心,可以实现对象之间的依赖注入。基于IOC,对象的依赖关系由容器在运行期决定,完成对象的装配。这可以降低对象之间的耦合,使设计更加灵活。

AOP全称是Aspect-Oriented Programming,即面向切面编程。它可以实现在不修改源代码的情况下,为程序动态添加功能。在程序执行过程中,AOP可以在合适的连接点(如方法调用前/后),插入切面来修改程序逻辑。这有助于实现诸如日志、安全等通用功能,而不用在业务逻辑代码中夹杂各种非业务逻辑。

简单来说,IOC和AOP的区别在于:

- IOC 注重在对象创建与依赖注入,目的在于降低耦合、增强灵活性。它由容器在运行期决定对象依赖关系。

- AOP 注重在动态插入切面来影响程序运行逻辑,目的在于实现通用功能而不改变原有代码。它允许在程序运行期间插入切面来修改逻辑。所以,尽管IOC和AOP都属于面向切面编程范畴,但侧重点不同:

- IOC侧重对象的依赖关系注入,实现解耦和灵活设计。

- AOP侧重在运行期动态修改程序逻辑,实现通用功能的插入。两者都是实现高内聚低耦合的有效手段,广泛应用在企业级框架与项目中。Spring就是典型代表,它同时采用IOC和AOP实现解耦、通用功能和业务逻辑分离。

通过b站上的黑马的spring课程做的笔记。

Spring 3.0时代,进入全注解时代。S

pringboot就是一个几乎零配置的企业级开发框架。

开始

 在不使用配置类时在applicationcontext配置文件中引入(后面也可以完全以注解的方式代替配置类)

    <!-- 配置扫描组件所在的包 -->
    <context:component-scan base-package="demo.pojo"/>

 @Component(value=bean的名称) 

若没有value则默认是类名的小写作为beanname.

测试用例

package demo.pojo;


import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

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

@Component(value = "yzh")
@Scope("singleton")
@Lazy(false)

public class user {


    public user() {
        System.out.println("无参构造执行");
    }


    @PostConstruct
    void init()
    {
        System.out.println("实例化后执行");
    }

    @PreDestroy
    void destroy()
    {
        System.out.println("bean销毁前执行");
    }

}

componet衍生出的3个注解

 既不属于web层,Service层,Dao层,普遍使用@Component.

Bean内部的属性进行注入

 

 @Value 在bean内部属性注入时,可直接放在bean的属性上,也可以放在bean的set方法中.

@Autowired 首先会根据类型进行注入,若发现有多个类型匹配,则根据注入的属性名进行匹配,若依然匹配不成功则提示报错。(在这种情况下,可以结合@Autowired,根据名称进行注入)

 @Resource 不指定名称时等同于@Autowired;指定名称时根据名称进行注入。

@Autowired扩展:

值得注意的是,当@AutoWired注解在方法上时,会根据参数的名字或者是集合中的类型进行注入(这种情况若发现有多个类型时,会全部注入到集合当中。)

非自定义的Bean管理

非自定义Bean不能像自定义Bean一样使用@Compnent进行管理,非自定义的Bean需要通过工厂的方式进行实例化,使用@Bean标注方法即可,@Bean的属性为beanName.若不加beanname则默认为方法名。(如以下的dataSource)。因为需要@Bean注解被扫描到,所以非自定义的bean所在的类必须被Spring容器管理。这也是为什么以下的'other'必须加component的原因。

见实例

package demo.otherbean;


import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

import javax.sql.DataSource;

@Component
public class other {




    @Bean("druid")
    public DataSource dataSource()
    {
        DruidDataSource   druid = new DruidDataSource();

        return  druid;
    }
}

当非自定义的Bean需要参数注入时:

基本数据类型 :@Value (位置放在参数内部)

引用类型:

1.根据名称进行注入时:@Qualifier("参数名称")此处可以省略@Autowired(这点和自定义bean的@Qualifier结合@Autowired注入时不同)

2.根据类型进行注入时: 可不加任何注解。如下面的userservice.

使用配置类完全替代XML配置文件

通过以上的注解已经能够代替bean标签,在使用配置文件时通过ClassPathXmlApplicationContext类去加载我们的配置文件;


        ClassPathXmlApplicationContext context=
                new  ClassPathXmlApplicationContext("applicationcontext.xml");

而使用配置类时,则用

AnnotationConfigApplicationContext 去加载配置类。

        ApplicationContext context=
                new AnnotationConfigApplicationContext(springconfig.class);

 配置类中的注解

@ComponentScan相当于

<context:component-scan base-package="demo.otherbean"/>

@ComponentScan相当于

<context:property-placeholder location="classpath:test.properties"/>

若有多项扫描项或需要读取的配置文件,则用数组形式。参考以下实例

package demo.config;


import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration  //标明这是一个配置类 交给Spring容器去管理
@ComponentScan({"demo.pojo","demo.otherbean"})
@PropertySource({"test.properties"})
public class springconfig {


}

@import 用于加载其他的配置文件,用于替代原xml标签中的<import>

spring中的其他注解(偶尔会用到)

 

 Spring注解的解析原理

 XML方式的组件扫描:在Spring容器创建时,使用XML命名空间的形式扫描指定的包以及子包下的类,识别注解,创建Beandefinition 存储到beandefinitionMap中最终进入单例池。

注解方式如@ComponentScan的组件扫描:通过BeanFactoryProcessor(bean工厂处理器)扫描注解创建Beandefinition存储到beandefinitionMap中最终进入单例池。而Bean的属性注入则通过BeanPostProcessor(Bean后处理器)扫描@Autowired等注解进行属性的注入。

spring使用注解整合第三方框架mybatis

原来的XML方式整合:

步骤

  1. 需要创建SqlSessionFactoryBean,而SqlSessionFactoryBean需要注入一个引用类型为DataSource。
  2. 创建 DataSource。DataSource属于非自定义的bean,需要通过工厂方法的方式进行注入,且该工厂方法所在的类需要被Spring容器管理.

jdbc.properties 连接数据库的配置信息:

 在这里发现了数据的格式问题,我在另一个项目中用yaml文件配置.在yaml文件里数据库的密码如上的061457需要加引号才能连接成功,而在.properties的配置文件中不能加引号才连接成功。(目前认为应该是配置文件的约束问题)

 

目录结构:

关于配置是否成功:

有个mybatisX的插件,一般来说xml文件能找到其对应的mapper接口映射文件则没什么问题。

核心注解

@MapperScan扫描Mapper接口

@PropertySource 加载配置文件

package demo.config;


import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

import javax.sql.DataSource;

@Configuration  //标明这是一个配置类 交给Spring容器去管理
@ComponentScan({"demo.pojo","demo.otherbean"})
@PropertySource({"jdbc.properties"})
@MapperScan("demo.mapper")
public class springconfig {



    @Bean
    public DataSource dataSource(
            @Value("${jdbc.username}")  String username,
            @Value("${jdbc.drive}") String drive,
            @Value("${jdbc.url}") String url,
            @Value("${jdbc.pwd}") String pwd

    )
    {


        System.out.println(username+":"+drive+":"+url+":"+pwd);
        DruidDataSource druid = new DruidDataSource();
        druid.setDriverClassName(drive);
        druid.setUrl(url);
        druid.setUsername(username);
        druid.setPassword(pwd);


        return  druid;
    }


    @Bean
    public SqlSessionFactoryBean  SqlSessionFactoryBean(DataSource dataSource) //此处注入不加注解则通过类型进行注入
    {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);

        return sqlSessionFactoryBean;
    }

}

XML和@Mapperscan注解整合Mybatis的底层原理:

简单的说:

都是扫描Mapper接口(比如以上的UserMapper),注册MapperFactorybean.而底层的MapperFactoryBean的getobject方法返回接口的实现。只不过入口不同,XML方式直接去配置MapperScannerConfig类,而注解通过导入MapperScannerRegister,通过MapperScannerRegister去注册MapperScannerConfig

@import整合第三方框架

        Spring与Mybatis的注解方式整合有个重要的技术点就是@Import,第三方框架与Spring整合很多都是凭借自定义标签完成的,而第三方框架与Spring整合注解方式很多是靠@Import注解完成的。

比如在myatis的@MapperScan注解中

 开发用的最多的还是导入普通的配置类。而需要整合自定义的第三方框架时,使用@Import导入实现ImportSelector接口的类以及实现ImportBeanDefinitionRegistrar接口的类就比较普遍了。

    下面给出一个实例(自定义注解导入实现ImportBeanDefinitionRegistrar接口的类)

自定义注解

package demo.config;


import org.springframework.context.annotation.Import;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Import(MyImportBeanDefinitionRegistrar.class)
public @interface Mymapper {



}

基于注解的AOP

Spring框架的AOP支持两种代理方式:基于JDK动态代理和基于CGLIB的代码生成代理。

  1. 基于JDK动态代理:使用JDK动态代理进行AOP代理时,目标对象必须实现至少一个接口。Spring会为实现了指定接口的目标对象动态生成一个代理对象,并在代理对象中拦截对目标方法的调用,并执行相应的增强逻辑。由于JDK动态代理是基于接口进行代理的,因此对于没有实现任何接口的目标类,无法使用JDK动态代理进行代理。

  2. 基于CGLIB的代码生成代理:如果目标对象没有实现任何接口,则Spring将使用CGLIB库来为该对象创建一个子类,并将代理逻辑织入到子类中。与JDK动态代理不同,CGLIB代理是通过生成目标类的子类来实现的,因此它能够代理没有实现任何接口的类。但是,由于CGLIB是通过生成目标类的子类来实现代理,所以对于final方法、private方法等无法覆盖的方法,也无法使用CGLIB来进行代理。

总之,Spring框架的AOP支持多种代理方式,在选择代理方式时需要根据目标对象是否实现接口、要代理的方法类型(final方法、private方法等)以及代理性能等因素来进行选择。通常情况下,如果目标对象实现了接口,则优先使用基于JDK动态代理的方式;否则,使用基于CGLIB的代码生成代理。

开启自动代理的注解,默认为基于JDK的动态代理,一般在配置类加上这个注解(因为基于注解开发,肯定要创建一个配置类)我发现无论有没有实现接口的类以上面两种方式(JDK的动态代理,CJLIB)都能实现AOP.

@EnableAspectJAutoProxy

基于CJlib的代理

@EnableAspectJAutoProxy(proxyTargetClass=true)

 AOP的相关Maven依赖


<!--提供AOP基本模块的功能-->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aop</artifactId>
                <version>5.3.20</version>
            </dependency>


<!--     AspectJ 是一种面向切面编程(AOP)框架,aspectjweaver 提供了实现基于 AspectJ 的 AOP 功能所需的运行时依赖关系。-->
            <dependency>
                <groupId>org.aspectj</groupId>
                <artifactId>aspectjweaver</artifactId>
                <version>1.9.6</version>
            </dependency>
<!--    spring-aspects 为 Spring AOP 提供了额外的方面(Aspect),可以用于事务管理等功能。-->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aspects</artifactId>
                <version>5.3.16</version>
            </dependency>

通知类

package demo.advise;


import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;

@EnableAspectJAutoProxy
@Component
@Aspect
public class advise {

@Pointcut("execution( *  demo.otherbean.*.*(..))")
public  void myponitcut(){} //切点表达式的抽取


    @Before("myponitcut()")//切点表达式,demo包下的otherbean包下的所有类的所有方法的所有参数为切点
    public  void beforeAdvise(JoinPoint joinPoint)
    {

        System.out.println("当前目标对象是:"+joinPoint.getTarget());
        System.out.println("表达式:"+joinPoint.getStaticPart());

        System.out.println("前置通知");
    }


    @After("myponitcut()")//切点表达式,demo包下的otherbean包下的所有类的所有方法的所有参数为切点
    public  void afterAdvise(JoinPoint joinPoint)
    {

        System.out.println("当前目标对象是:"+joinPoint.getTarget());
        System.out.println("表达式:"+joinPoint.getStaticPart());

        System.out.println("后置通知");
    }
}

 通过这个通知类可以看到:

它可以带参数为JoinPoint(切点),更可以通过其getTarget方法拿到切点所在的类对象。

昊月光华
关注 关注
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
“掌握Spring IoCAOP:30道面试必备问题解析!“
weixin_44976692的博客
01-03 2万+
在面试过程中,SpringIoC(控制反转)和AOP(面向切面编程)是被频繁问及的重要主题。掌握这两个核心概念和技术,对于成为一名优秀的Java开发者至关重要。本篇博客将为你提供一份包含20个关键问题的面试指南,助你在面试中游刃有余,展现出对Spring IoCAOP的深刻理解。无论你是初学者还是有经验的开发者,这20个问题将覆盖IoCAOP的核心知识点,帮你更好地准备面试。让我们一同深入探讨,揭秘SpringIoCAOP的奥秘,为你的面试之路加分不少!🚀💻。
@Autowired与@Resource
wangooo的博客
02-22 250
相同点: @Resource的作用相当于@Autowired,均可标注在字段或属性的setter方法上。 不同点: (1)提供方:@Autowired是由org.springframework.beans.factory.annotation.Autowired提供,换句话说就是由Spring提供;@Resource是由javax.annotation.Resource提供,即J2EE提供,需要JDK1.6及以上。 (2)注入方式:@Autowired只按照byType 注入;@Resource默认
使用注解实现IoC/AOP
好人一生平安
09-13 353
什么是注解? 用来修饰代码,表示一些额外的信息。 源注解:修饰注解注解。 定义注解 @interface spring提供的注解 1、IOC操作 1)@Component :用于实现ioc控制反转,属性value用于实现对象id定义 2)@Scope :用于实现单例,多例,request,session等的配置 3)@Controller : 专门用于contro...
使用注解的方式实现AOPIoC
Maggie~~的博客
01-28 412
使用注解实现Spring IoC 使用步骤: 1,修改配置文件 2,使用注解定义Bean 3,使用注解实现Bean的注入功能 ​ 1)修改配置文件 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop=
spring使用注解方式完成IOCAOP功能
guoyp2126的博客
04-24 1380
前言 控制反转依赖注入(IOC)及AOPspring的核心功能,spring使用xml文件完成配置,基本上已经废弃,目前主流的是使用注解的方式完成这两项功能。以下通过示例,演示注解的方式,实现IOCAOP。 创建maven工程 输入工程名称,完成工程创建。打开pom文件,加入spring依赖包 在main目录下加入resource文件夹,并将其设置为Resources Root 在resources文件夹下,创建spring配置文件,applicationContext.xml IOC依赖注入
自定义实现SpringMvc框架,自定义@Controller、@RequestMapping注解,自己也是一步一步的对代码的理解出来的,只是比较简单的例子
you_are_my_life的博客
09-14 2603
1.自定义的DispatcherServlet,就是SpringMvc运行加载类 /*** * 手写SpringMvc框架&lt;br&gt; * 思路:&lt;br&gt; * 1.手动创建一个DispatcherServlet 拦截项目的所有请求 SpringMvc 基于servlet实现&lt;br&gt; * 2.extends HttpHttpServlet 重写init 方...
spring ioc+aop.zip
07-22
Spring 框架是 Java 开发中的核心框架之一,它主要由两个重要模块构成:IOC(Inversion of Control,控制反转)和 AOP(Aspect-Oriented Programming,面向切面编程)。这两个概念在现代企业级应用开发中起着至关...
手写spring框架ioc+aop+mvc
11-01
在这个"手写 spring 框架 ioc+aop+mvc"的项目中,我们将深入理解这三个关键组件的实现原理。 1. **依赖注入(IOC)**: 依赖注入是 Spring 框架的核心特性,它允许我们解耦组件间的依赖关系,使得代码更加灵活和可...
Spring注解实现IOCAOP
weixin_73468155的博客
08-29 543
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考AspectJ 面向切面的框架,它扩展了Java语言,定义了AOP 语法,能够在编译期提供代码的织入。...
注解方式模拟Spring IoC AOP
09-12
- **基于注解AOP**:Spring支持在方法上直接定义切面注解,如`@Before`, `@After`, `@Around`等。当目标方法被调用时,Spring会检查是否有相关的切面注解并执行相应操作。 为了模拟AOP,我们可以创建一个拦截器...
Spring注解必知必会】深度解析@Component注解实现原理
m0_71777195的博客
08-16 5444
想必@Component注解大家一直在使用,只要类上加上它,就可以被Spring容器管理,那大家有想过它是怎么实现的吗?本篇文章就带领到家揭秘。用来标记的类是一个“组件”或者说是一个Bean,Spring会自动扫描标记@Component注解的类作为一个Spring Bean对象。@Indexed/***/}复制代码value: 自定义当前组件或者说bean的名称,可以不配置, 不配置的话默认为组件的首字母小写的类名。该注解只能使用在类,接口、枚举、其他注解上该注解的生命周期是运行时JVM。...
配置中心Component + @Value动态配置实现
大鸡腿的博客
11-04 3715
文章目录前言实现方式具体步骤参考博客 前言 我们公司很多组件做自研的,里面有一个配置中心,然后我当时有点想法,nacos以及apoll是怎么样做动态配置的呢? 实现方式 对@Component + @Value 实现动态注入 实现原理:会有一层缓存,然后存在对应key(@Value的值),然后还有对象实例,然后还有字段,可以进行赋值对吧。当我们收到更新数据的时候,通过key来拿到实例,然后对属性进行set,这样就实现动态配置了。 具体步骤 首先需要重写BeanPostProcessor,主要是在类加载过程
spring基于注解的配置小结
weixin_53099632的博客
07-13 138
spring基于注解配置小论
Spring基础学习
努力努力再努力
01-27 433
@component是用来创建对象的。默认是创建单例对象。    属性: value , 表示&lt;bean&gt;对象的 id,也就是对象的名称。    位置:在类的定义上面。  基本上所有的可以给类 使用注解 都是写在类的上面的。 @component(value=”所要创建的对象的名称”)  因为写在了类的上面就不用再像&lt;bean&gt;标签一样需要写类的全地址了  等价...
Spring注解开发
最新发布
keepdreams的博客
03-02 188
可以通过Bean标签进行设置。
注解@Component
大圣归来圣骑士清欢的博客
09-23 3205
注解
Spring中基于注解的配置详解
InterestAndFun的博客
04-20 1273
在现在的框架开发中,大多数用的都是注解开发技术。注解配置要实现的功能和XML实现的功能都是一样的,只是配置的形式不同。 注解的标签可以分为3类:创建对象、注入数据、其他配置。XML配置文件亦是如此。 看一个简单的例子:例子中的3个框就是分成了3类,这三类标签最后都可以用注解来代替。 现在开始详细介绍spring中的标签。 一、Spring中的标签汇总 用于创建对象: @Component、@Controller、@Service、@Repository 用于注入数据: @Value、@Resource、@
spring--基础--05--基于注解的配置
zhou920786312的博客
09-20 221
五 基于注解的配置 @Required:应用于bean属性的setter方法。 @Autowired:应用到bean属性的setter方法,非setter方法,构造函数和属性。 @Qualifier:指定确切的的bean, @Autowired和@Qualifier注解可以用来删除混乱。 JSR-250Annotations:支持JSR-250的基础的注解 @Resource @PostConstruct @PreDestroy <?xml version="1.0" encoding=
Spring——基于注解的配置
热门推荐
Gavin
07-15 2万+
Spring注解配置 从 Spring 2.5 开始就可以使用注解来配置依赖注入。使用注解的方式使我们无需在XML中配置一个Bean引用,更加简单和方便。 注解配置默认情况下在Spring中是关闭的,我们需要在配置文件中使用&lt;context:annotation-config/&gt;激活它。 如下spring-config.xml文件: &lt;?xml version="1....
掌握Spring IOCAOP实例教程
Spring中,IOC容器是通过配置文件、注解或者基于Java的配置类来配置和管理的。IOC容器负责创建对象,维护对象间的关系,并调用它们的方法,从而实现了业务逻辑与对象创建和管理的分离。SpringAOP则是通过代理...
写文章

热门文章

  • 基于HAL库的STM32的串口DMA发送数据(解决只发送一次数据)及DMA+空闲中断接受数据 18925
  • Not enough information to list load addresses in the image map.(STM32编译报错) 14788
  • 多种方式解决交叉编译中glibc版本不兼容导致的编译问题(libc.so.6: version `GLIBC_xxx‘ not found问题) 13623
  • 蓝桥杯客观题知识点汇总(自我总结)以及主观题Debug痛点 12638
  • Mysql查询(以xx字符开头,以xx字符结尾,第几个字符是xxx) 12586

分类专栏

  • Linux 10篇
  • C++ 11篇
  • Hexo 1篇
  • 51 41篇
  • Android 5篇
  • NCNN 3篇
  • C 21篇
  • 蓝桥杯单片机/嵌入式代码参考 1篇
  • 算法 11篇
  • 嵌入式软件面经 1篇
  • RT_Thread 4篇
  • STM32 32篇
  • RISCV 1篇
  • Java 22篇
  • arduino 5篇
  • springboot 2篇
  • pytorch 2篇
  • Python 5篇
  • 蓝桥杯 9篇
  • 编译 1篇
  • 试错 1篇
  • mybatis 4篇
  • Mysql 7篇

最新评论

  • 基于HAL库的STM32的串口DMA发送数据(解决只发送一次数据)及DMA+空闲中断接受数据

    wlznswyxyy: 感谢,找了好久问题终于解决了,把DMA初始化放在了串口初始化前面就能运行了表情包

  • 基于HAL库的STM32的串口DMA发送数据(解决只发送一次数据)及DMA+空闲中断接受数据

    2301_80419515: 感谢博主指点(解决了我dma不能连续发送的问题),学得好深入啊,我检查了好久也没检查出来表情包表情包

  • 基于STM32的F1的RTC实时时钟+CUBEMX实时获取时间戳实现断电跨天同步时间戳

    2301_80148433: 最后那个函数加在那个位置的呀,重新配置的时候会被删掉吗

  • Not enough information to list load addresses in the image map.(STM32编译报错)

    快乐辣条66: static修饰了,表示该变量只能在当前.c文件中使用

  • ESP32基于Arduino驱动GY30光照传感器程序

    五羟基己醛: 同问,我的也是

大家在看

  • LeaferJS基础
  • 深入理解Canvas的save()与restore():掌控绘图状态的艺术
  • 【含开题报告+文档+PPT+源码】基于SpringBoot+Vue的外卖配送平台系统的设计与实现
  • Java IO 模型详解
  • 【JAVA毕业设计】基于Vue和SpringBoot的社区团购系统

最新文章

  • 关于CMAKE构建C/C++遇到的问题汇总
  • 判断交叉编译工具是否支持C++20的标准
  • MingW-W64交叉编译找不到‘mutex‘问题解决
2024年4篇
2023年42篇
2022年98篇
2021年16篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家昌平区商场美陈宜宾玻璃钢艺术雕塑韶关玻璃钢雕塑的特点汕头玻璃钢动物雕塑哪里买服务质量好的玻璃钢雕塑玻璃钢雕塑加工合同贴银箔玻璃钢花盆厂家江油玻璃钢座椅雕塑玻璃钢雕塑结实嘉兴人物玻璃钢雕塑销售电话四川定制玻璃钢雕塑方法玻璃钢浮雕塑厂家玻璃钢花盆黄页供应玻璃钢动物雕塑品牌深圳秋季商场美陈批发价鄂州玻璃钢胸像雕塑安装甘南玻璃钢动物雕塑厂家北京主题商场美陈销售开封玻璃钢雕塑厂家云南公园标识玻璃钢景观雕塑厂家商场美陈狗狗南充玻璃钢仿真水果雕塑定制洛阳泡沫玻璃钢雕塑公司玻璃钢花盆改造出租屋福建特色商场美陈厂家供应金华动物玻璃钢雕塑玻璃钢雕塑哪里有卖许昌玻璃钢雕塑制作流程玻璃钢雕塑组成宜秀玻璃钢花盆花器香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化