黑马程序员SSM-Spring学习笔记

2023-11-12

学完Spring之后是SpringMVC


前言

学习Spring过程的笔记,没事得常回来看看0.0


一、注解开发

1.1 注解开发定义bean

使用@Component定义bean

@Component("bookDao")
public class BookDaoImpl implements BookDao {
    public void save() {
        System.out.println("book dao save ...");
    }
}

核心配置文件中通过组件扫描加载bean

<context:component-scan base-package="com.itheima"/>

Spring提供@Component注解的三个衍生注解

1.@Controller:用于表现层bean定义

2.@Service:用于业务层bean定于

@Service
public class BookServiceImpl implements BookService {}

3.@Repository:用于数据层bean定义

@Repository
public class BookDaoImpl implements BookDao {}

1.2纯注解开发

Spring3.0开启了 纯注解开发模式,使用java类替代配置文件,开启了Spring快速开发通道

Java类代替Spring核心配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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">
    <context:component-scan base-package="com.itheima"/>
</beans>

 以上applicationContext.xml文件将会由以下SpringConfig.java文件代替

@Configuration
@ComponentScan("com.itheima")
public class SpringConfig{}

@Configuration注解用于设定当前类为配置类

@ComponentScan注解用于设定扫描路径,此注解只能添加一次,多个数据用数组格式

@ComponentScan({"com.itheima.service","com.itheima.dao"})

读取Spring核心配置文件初始化容器对象切换为读取Java配置类初始化容器对象

ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");


ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);

1.3bean作用范围

使用@Scope定义bean作用范围

使用@PostConstruct、@PreDestroy定义生命周期

@Repository
//@Scope设置bean的作用范围
@Scope("singleton")
public class BookDaoImpl implements BookDao {

    public void save() {
        System.out.println("book dao save ...");
    }
    @PostConstruct
    public void init(){
        System.out.println("book dao init ...");
    }
    @PreDestroy
    public void destrop() {
        System.out.println("book dao destroy...");
    }
}

1.4依赖注入-自动装配

使用@Autowired注解开启自动装配模式(按类型)

使用@Qualifier注解开启指定名称装配bean

@Service
public class BookServiceImpl implements BookService {
    @Autowired
    @Qualifier("bookDao2")
    private BookDao bookDao;
   
}

注意:自动装配基于反射设计创建对象并暴力反射对应属性为私有属性初始化数据,因此无需提供setter方法。

注意:自动装配建议使用无参构造方法创建对象(默认),如果不提供对应构造方法,请提供唯一的构造方法。

注意:@Qualifier注解无法单独使用,必须配合@Autowired注解使用

使用@Value实现简单类型注入

@Repository("bookDao")
public class BookDaoImpl2 implements BookDao {
    @Value("szc")
    private String name;
}

使用@PropertySource注解加载properties文件

@Configuration
@ComponentScan("com.itheima")
@PropertySource({"classpath:jdbc.properties"})
public class SpringConfig {
}

注意:路径仅支持单一文件配置,多文件使用数组格式配置,不允许使用通配符*


1.5 第三方bean管理

使用@Bean配置地方三方bean

@Configuration
public class SpringConfig{
     @Bean
    public DataSource dataSource(){
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql//localhost:3306/spring_db");
        ds.setUsername("root");
        ds.setPassword("155931");
        return ds;
    }
}

将独立的配置类加入核心配置

方式一:导入式

public class JdbcConfig {
    //1.定义一个方法获得要管理的对象
    //2.添加@Bean,表示当前方法的返回值是一个bean
    @Bean
    public DataSource dataSource(){
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql//localhost:3306/spring_db");
        ds.setUsername("root");
        ds.setPassword("155931");
        return ds;
    }
}

使用@Import注解手动加入配置类到核心配置,此注解只能添加一次,多个数据用数组格式

@Configuration
@Import(JdbcConfig.class)
public class SpringConfig {

}

方式二:扫描式(不推荐)

@Configuration
public class JdbcConfig {
    //1.定义一个方法获得要管理的对象
    //2.添加@Bean,表示当前方法的返回值是一个bean
    @Bean
    public DataSource dataSource(){
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql//localhost:3306/spring_db");
        ds.setUsername("root");
        ds.setPassword("155931");
        return ds;
    }
}

使用@ComponentScan注解扫描类所在的包,加载对应的配置类信息

@Configuration
@Import("com.itheima.config")
public class SpringConfig {

}

 简单类型依赖注入

public class JdbcConfig {
    @Value("com.mysql.jdbc.Driver")
    private  String driver;
    @Value("jdbc:mysql//localhost:3306/spring_db")
    private  String url;
    @Value("root")
    private  String username;
    @Value("155931")
    private  String password;
    //1.定义一个方法获得要管理的对象
    //2.添加@Bean,表示当前方法的返回值是一个bean
    @Bean
    public DataSource dataSource() {
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName(driver);
        ds.setUrl(url);
        ds.setUsername(username);
        ds.setPassword(password);
        return ds;
    }
}

引用类型依赖注入

@Bean
public DataSource dataSource(BookService bookService) {
       System.out.println(bookService);
       DruidDataSource ds = new DruidDataSource();
       //属性设置
       return ds;
    }

引用类型注入只需要为bean定义方法设置形参即可,容器会根据对象自动装配对象


1.6 总结


二、Spring整合MyBatis 

需另外导入以下两个包

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-jdbc</artifactId>
  <version>5.2.10.RELEASE</version>
</dependency>

<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis-spring</artifactId>
  <version>1.3.0</version>
</dependency>

2.1.产生SqlSessionFactoryBean

将以下代码转化成如下

<typeAliases>
        <package name="com.itheima.domain"/>
    </typeAliases>
    <environments default="mysql">
        <environment id="mysql">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"></property>
                <property name="url" value="${jdbc.url}"></property>
                <property name="username" value="${jdbc.username}"></property>
                <property name="password" value="${jdbc.password}"></property>
            </dataSource>
        </environment>
    </environments>
 @Bean
    public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource) {
        SqlSessionFactoryBean ssfb= new SqlSessionFactoryBean();
        ssfb.setTypeAliasesPackage("com.itheima.domain");
        ssfb.setDataSource(dataSource);
        return ssfb;
    }

SqlSession生成的一系列操作由SqlSessionFactoryBean解决

// 1. 创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 2. 加载SqlMapConfig.xml配置文件
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml.bak");
// 3. 创建SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
// 4. 获取SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();

这里的DataSurce 会自动生成 因为在JdbcConfig.class文件中已经生成了bean

public class JdbcConfig {
    @Value("${jdbc.driver}")
    private String driver;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String userName;
    @Value("${jdbc.password}")
    private String password;

    @Bean
    public DataSource dataSource(){
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName(driver);
        ds.setUrl(url);
        ds.setUsername(userName);
        ds.setPassword(password);
        return ds;
    }
}

2.产生MapperScannerConfigurer

<mappers>
        <package name="com.itheima.dao"></package>
    </mappers>
 @Bean
    public MapperScannerConfigurer mapperScannerConfigurer() {
        MapperScannerConfigurer msc = new MapperScannerConfigurer();
        msc.setBasePackage("com.itheima.dao");
        return msc;
    }

三、 Spring整合Junit

需另外导入以下两个包

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.12</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>Spring-test</artifactId>
  <version>5.2.10.RELEASE</version>
</dependency>

使用Spring整合Junit专用的类加载器

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfig.class)
public class AccountServiceTest {
    @Autowired
    private AccountService accountService;
    @Test
    public void testFindById(){
        System.out.println(accountService.findById(1));
    }
}

注意前两行注释 ,需要测试什么对象 注入之后自动打包即可

四、AOP

        AOP(Aspect Oriented Programming)面向切面编程,一种编程范式,指导开发者如何组织程序结构。Spring理念是无入侵式。

        在不惊动原始设计的基础上进行功能增强。

                

 

 4.1 AOP入门案例

1.导入包,Spring包导入会自动导入AOP

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>5.2.10.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.aspectj</groupId>
  <artifactId>aspectjweaver</artifactId>
  <version>1.9.4</version>
</dependency>

 

2. 定义dao接口与实现类

public interface BookDao {
    public void save();
    public void update();
}
@Repository
public class BookDaoImpl implements BookDao {

    public void save() {
        System.out.println(System.currentTimeMillis());
        System.out.println("book dao save ...");
    }
    public void update(){
        System.out.println("book dao update ...");
    }
}

3.定义通知类,制作通知

public class MyAdvice {
    public void method(){
        System.out.println(System.currentTimeMillis());
    }
}

4.定义切入点

public class MyAdvice {
    @Pointcut("execution(void com.itheima.dao.BookDao.update())")
    private void pt(){}
}

说明:切入点定义依托一个不具有实际意义的方法进行,即无参数,无返回值,方法体无实际逻辑

5.绑定切入点与通知关系,并指定通知添加到原始连接点的具体执行位置

public class MyAdvice {
    @Pointcut("execution(void com.itheima.dao.BookDao.update())")
    private void pt(){}
    @Before("pt()")
    public void method(){
        System.out.println(System.currentTimeMillis());
    }
}

6.定义通知类受Spring容器管理,并定义当前类为切面类

@Component
@Aspect
public class MyAdvice {
    @Pointcut("execution(void com.itheima.dao.BookDao.update())")
    private void pt(){}
    @Before("pt()")
    public void method(){
        System.out.println(System.currentTimeMillis());
    }
}

7.开启Spring对AOP注解驱动支持

@Configuration
@ComponentScan("com.itheima")
@EnableAspectJAutoProxy//存在注解开发的AOP
public class SpringConfig {
}

4.2 AOP工作流程

1.Spring容器启动

2.读取所有切面配置中的切入点

3.初始化bean,判定bean对应的类中的方法是否匹配到任意切入点

        匹配失败,创建对象

        匹配成功,创建原始对象(目标对象)的代理对象

4.获取bean执行方法

        获取bean,调用方法并执行,完成操作

        获取的bean是代理对象时,根据代理对象的运行模式运行原始方法与增强的内容,完成操作。

目标对象(Target):原始功能去掉共性功能对应的类产生的对象,这种对象是无法直接完成最终工作的。

代理(Proxy):目标对象无法直接玩成工作,需要对其进行功能回填,通过原始对象的代理对象实现。


4.3 AOP切入点表达式

切入点:要进行增强的方法

切入点表达式:要进行增强的方法的描述方式

4.3.1 描述方式

1.执行com.itheima.dao包下的BookDao接口中的无参数update方法

execution(void.com.itheima.dao.BookDao.update())

2.执行com.itheima.dao.impl包下的BookDaoImpl类中的无参数update方法

execution(void com.itheima.dao.impl.BookDaoImpl.update())

4.3.2 切入点表达式标准格式:

动作关键词(访问修饰符 返回值 包名.类/接口名.方法名(参数)异常名)

execution(public User com.itheima.service.UserService.findById(int))

 可以使用通配符描述切入点,快速描述

4.3.3 书写技巧

 4.4 AOP通知类型

          AOP通知描述了抽取的共性功能,根据共性功能抽取的位置不同,最终运行代码时要将其加入到合理位置。

        前置通知、后置通知、环绕通知(重点)、返回后通知(了解)、抛出异常后通知(了解)

 

 

 

 



4.5 测试业务层接口万次执行效率 

@Component
@Aspect
public class ProjectAdvice {
    //匹配业务层的所有方法
    @Pointcut("execution(* com.itheima.service.*Service.*(..))")
    private void servicePt(){}
    @Around("ProjectAdvice.servicePt()")
    public void runSpeed(ProceedingJoinPoint pjp) throws Throwable {
        Signature signature = pjp.getSignature();
        String declaringTypeName = signature.getDeclaringTypeName();
        String name = signature.getName();

        Long start = System.currentTimeMillis();
        for(int i = 0; i <10000; i++){
            pjp.proceed();
        }
        long end = System.currentTimeMillis();
        System.out.println("万次执行:"+declaringTypeName+"."+name+"------>"+(end-start));
    }
}

4.6 AOP通知获取数据

 

JoinPoint对象描述了连接点方法的运行状态,可以获取到原始方法的调用参数

@Before("pt()")
public void before(JoinPoint jp) {
     Object[] args = jp.getArgs();
     System.out.println(Arrays.toString(args));    
}

ProceedJointPointJoinPoint的子类,专用于环绕通知,可以实现对原始方法的调用

@Around("pt()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
    Object[] args = pjp.getArgs();
    System.out.println(Arrays.toString(args));
    Object ret = pjp.proceed(args);
    return ret;
}

 设置返回后通知获取原始方法的返回值

要求returning属性值必须与方法形参名相同

@AfterReturning(value = "pt()",returning = "ret")
public void afterReturning(JoinPoint jp,String ret) {
     System.out.println("afterReturning advice ..."+ret);
}

抛出异常后通知可以获取切入点方法中出现的异常信息,使用形参可以接受对应的异常对象

throwing的属性值必须与方法中的形参名相同

@AfterThrowing(value = "pt()",throwing = "t")
public void afterThrowing(Throwable t) {
     System.out.println("afterThrowing advice ..."+t);
}

4.7 案例:百度网盘密码数据兼容处理

  @Around("DataAdvice.servicePt()")
    public Object trimStr(ProceedingJoinPoint pjp) throws Throwable {
        Object[] args = pjp.getArgs();
        for(int i = 0; i < args.length;i++){
            //判断参数是不是字符串
            if(args[i].getClass().equals(String.class)){
                args[i]=args[i].toString().trim();
            }
        }
        Object ret = pjp.proceed(args);
        return ret;
    }

五、 Spring事务

简介

事务作用:再数据层保障一系列的数据库操作同成功同失败

Spring事务作用:在数据层业务层保障一系列的数据库操作同成功同失败

 5.1 案例

 1.在业务层接口上添加Spring事务管理

//配置当前接口方法具有事务
    @Transactional
    public void transfer(String out,String in ,Double money) ;
}

 注意:Sring注解式事务通常添加在业务层接口中而不会添加到业务层实现类中,降低耦合,

注解式事务可以添加到业务方法上表示当前方法开启事务,也可以添加到接口上表示当前接口所有方法开启事务

 2.设置事务管理器

在JDBC配置中添加如下

//配置事务管理器
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource){
    DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
    transactionManager.setDataSource(dataSource);
    return transactionManager;
}

注意:事务管理器根据实现技术进行选择Mybatis框架使用的是JDBC事务

3.开启注解式事务驱动@EnableTransactionManagement

@Configuration
@ComponentScan("com.itheima")
@PropertySource("classpath:jdbc.properties")
@Import({JdbcConfig.class,MybatisConfig.class})
//开启注解式事务驱动
@EnableTransactionManagement
public class SpringConfig {
}

5.2 Spring事务角色

 5.3 Spring事务相关配置/案例

 

 

 1.在业务层接口上添加Spring事务,设置事务传播行为REQUIRES_NEW(需要新事务)

也可以在该接口的实现类中的方法之上添加

public interface LogService {
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    void log(String out, String in, Double money);
}

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

黑马程序员SSM-Spring学习笔记 的相关文章

  • Hibernate 挂起或引发延迟初始化,没有会话或会话已关闭

    我正在增强旧的 Spring Hibernate 应用程序 但我陷入困境 我有一种方法可以读取 3000 多行长的文件 每行都有一条记录 必须与数据库中的某些内容进行比较 然后必须将寄存器添加到数据库 多对多表 表和关系是 Branch h
  • 动态选择端口号?

    在 Java 中 我需要获取端口号以在同一程序的多个实例之间进行通信 现在 我可以简单地选择一些固定的数字并使用它 但我想知道是否有一种方法可以动态选择端口号 这样我就不必打扰我的用户设置端口号 这是我的一个想法 其工作原理如下 有一个固定
  • 如何在java中将一个数组列表替换为另一个不同大小的数组列表

    我有两个大小不同的数组列表 如何从此替换 ArrayList
  • 过滤两次 Lambda Java

    我有一个清单如下 1 2 3 4 5 6 7 和 预期结果必须是 1 2 3 4 5 6 7 我知道怎么做才能到7点 我的结果 1 2 3 4 5 6 我也想知道如何输入 7 我添加了i gt i objList size 1到我的过滤器
  • 谷歌应用程序引擎会话

    什么是java应用程序引擎 默认会话超时 如果我们将会话超时设置为非常非常长的时间 会不会产生不良影响 因为谷歌应用程序引擎会话默认情况下仅存储在数据存储中 就像facebook一样 每次访问该页面时 会话仍然永远存在 默认会话超时设置为
  • 在接口中使用默认方法是否违反接口隔离原则?

    我正在学习 SOLID 原则 ISP 指出 客户端不应被迫依赖于他们所使用的接口 不使用 在接口中使用默认方法是否违反了这个原则 我见过类似的问题 但我在这里发布了一个示例 以便更清楚地了解我的示例是否违反了 ISP 假设我有这个例子 pu
  • Java 公历日历更改时区

    我正在尝试设置 HOUR OF DAY 字段并更改 GregorianCalendar 日期对象的时区 GregorianCalendar date new GregorianCalendar TimeZone getTimeZone GM
  • 帮助将图像从 Servlet 获取到 JSP 页面 [重复]

    这个问题在这里已经有答案了 我目前必须生成一个显示字符串文本的图像 我需要在 Servlet 上制作此图像 然后以某种方式将图像传递到 JSP 页面 以便它可以显示它 我试图避免保存图像 而是以某种方式将图像流式传输到 JSP 自从我开始寻
  • Hibernate 的 PersistentSet 不使用 hashCode/equals 的自定义实现

    所以我有一本实体书 public class Book private String id private String name private String description private Image coverImage pr
  • volatile、final 和synchronized 安全发布的区别

    给定一个带有变量 x 的 A 类 变量 x 在类构造函数中设置 A x 77 我们想将 x 发布到其他线程 考虑以下 3 种变量 x 线程安全 发布的情况 1 x is final 2 x is volatile 3 x 设定为同步块 sy
  • 如何在用户输入数据后重新运行java代码

    嘿 我有一个基本的java 应用程序 显示人们是成年人还是青少年等 我从java开始 在用户输入年龄和字符串后我找不到如何制作它它们被归类为 我希望它重新运行整个过程 以便其他人可以尝试 的节目 我一直在考虑做一个循环 但这对我来说没有用
  • 如何访问JAR文件中的Maven资源? [复制]

    这个问题在这里已经有答案了 我有一个使用 Maven 构建的 Java 应用程序 我有一个资源文件夹com pkg resources 我需要从中访问文件 例如directory txt 我一直在查看各种教程和其他答案 但似乎没有一个对我有
  • 获取文件的总大小(以字节为单位)[重复]

    这个问题在这里已经有答案了 可能的重复 java 高效获取文件大小 https stackoverflow com questions 116574 java get file size efficiently 我有一个名为 filenam
  • Eclipse 选项卡宽度不变

    我浏览了一些与此相关的帖子 但它们似乎并不能帮助我解决我的问题 我有一个项目 其中 java 文件以 2 个空格的宽度缩进 我想将所有内容更改为 4 空格宽度 我尝试了 正确的缩进 选项 但当我将几行修改为 4 空格缩进时 它只是将所有内容
  • 关键字“table”附近的语法不正确,无法提取结果集

    我使用 SQL Server 创建了一个项目 其中包含以下文件 UserDAO java public class UserDAO private static SessionFactory sessionFactory static se
  • 如何使用 jUnit 将测试用例添加到套件中?

    我有 2 个测试类 都扩展了TestCase 每个类都包含一堆针对我的程序运行的单独测试 如何将这两个类 以及它们拥有的所有测试 作为同一套件的一部分执行 我正在使用 jUnit 4 8 在 jUnit4 中你有这样的东西 RunWith
  • Cucumber 0.4.3 (cuke4duke) 与 java + maven gem 问题

    我最近开始为 Cucumber 安装一个示例项目 并尝试使用 maven java 运行它 我遵循了这个指南 http www goodercode com wp using cucumber tests with maven and ja
  • 最新的 Hibernate 和 Derby:无法建立 JDBC 连接

    我正在尝试创建一个使用 Hibernate 连接到 Derby 数据库的准系统项目 我正在使用 Hibernate 和 Derby 的最新版本 但我得到的是通用的Unable to make JDBC Connection error 这是
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • Java中super关键字的范围和使用

    为什么无法使用 super 关键字访问父类变量 使用以下代码 输出为 feline cougar c c class Feline public String type f public Feline System out print fe

随机推荐

  • 遍历一个HashMap

    可以通过2种方法遍历HashMap Map map new HashMap for Iterator iter map entrySet iterator iter hasNext Map Entry entry Map Entry ite
  • Centos 6.5、7升级安装openssh8.2p1

    因centos7自带的ssh版本较低 存在高危漏洞 故升级到最新版本 目前是8 2p1 注意 升级ssh存在一定的危险性 一旦不成功可能无法通过远程连接到系统 因此在升级之前最好先安装vnc或者telnet等远程服务 1 准备工作 查看下当
  • Qt开发 入门

    1 Qt概述 什么是Qt 不论我们学习什么样的知识点首先第一步都需要搞明白它是什么 这样才能明确当前学习的方向是否正确 下面给大家介绍一下什么是Qt Qt是一个跨平台的C 应用程序开发框架 具有短平快的优秀特质 投资少 周期短 见效快 效益
  • 等待一秒lua

    等待1秒 threadpool wait 1 等待1秒 threadpool wait 1 lua 等待1秒 threadpool wait 1
  • 嵌入式学习之STM32实现OLED

    嵌入式学习之STM32实现OLED 一 实验要求 二 SPI介绍 三 OLED介绍 四 实验过程 1 代码编写 实验结果演示 一 实验要求 理解OLED屏显和汉字点阵编码原理 使用STM32F103的SPI或IIC接口实现以下功能 显示自己
  • VS2019之WebAPI的创建与调用方法

    一 使用VS2019创建WebAPI 使用ValuesController cs来编写WebAPI的方法 重要 WebApiConfig cs的配置代码 注意访问方式 WebApi在访问时在主机名后加 api 然后再加控件器 方法 参数 如
  • R、Rstudio和Rtools的安装(以4.3.0版本为例)

    1 R的安装 下载地址 The Comprehensive R Archive Network tsinghua edu cn 这里下载的是4 3 0版本 选择Windows版本 下载后选择路径进行安装 默认选项即可 2 Rtools的安装
  • LabVIEW2018安装与使用

    安装 https blog csdn net m0 38106923 article details 88654150 每一个labview程序叫做一个vi 文件 新建vi 前面板 放一些控件 eg 输入控件 输出控件 显示控件 右键 选择
  • HttpMessageNotReadableException: JSON parse error: Unexpected character (‘“‘ (code 34)): was expecti

    作者 我弟 接口请求报错 2022 07 16 16 41 01 579 WARN 18820 nio 9002 exec 3 w s m s DefaultHandlerExceptionResolver Resolved org spr
  • Redis数据库安装

    1 redis安装包下载 redis安装包下载地址 https github com MicrosoftArchive redis releases windows下载msi安装包即可 2 安装redis 下载完成后 点击进行安装 按默认配
  • IT项目管理 — 作业7

    题目 Tony Prince 和他的团队正在做一个娱乐和健康方面的项目 他们被要求修改现有的成本估计 以便能有一个可靠的评价项目绩效的基线 进度和成本目标是在 6 个月内在 200 000 美元的预算下完成项目 准备和打印一页类似于图 7
  • 有什么好用的Angular插件推荐吗?

    10 个最受欢迎的 Angular 库 一 Angular Material Angular Material 是由 Google 开发的一款工具 是适合与 Angular 框架一起使用的 UI UX 组件库 Angular Materia
  • 实现DNS主从复制、子域、转发、智能DNS

    主从复制 前提准备 关闭SElinux 关闭防火墙 时间同步 环境说明 Centos7 ip地址 dns master 10 0 0 100 dns slave 10 0 0 103 web 10 0 0 101 目的 搭建DNS主从服务器
  • 计算机原理-结构组成

    cpu 中央处理器 程序控制 操作控制 时间控制 数据处理 运算器 算数逻辑单元ALU 逻辑运行 累加计算器AC 为alu提供工作区 数据缓存寄存器 DR 暂存指令和数据 状态条件寄存器PSW 保存指令条件码 控制器 程序计数器PC 指令计
  • python华为OD机试-进制转换-(5)

    题目5 题目描述 写出一个程序 接受一个十六进制的数 输出该数值的十进制表示 输入描述 输入一个十六进制的数值字符串 注意 一个用例会同时有多组输入数据 请参考帖子https www nowcoder com discuss 276处理多组
  • Matlab中的画图函数

    目录 一 二维曲线和图形 1 二维图像基本命令plot 1 曲线线型 颜色和标记点类型 2 设置曲线线宽 标记点大小 标记点边框颜色和标记点填充颜色等 3 坐标轴设置 4 坐标轴刻度设置 5 图例 6 更多的设置 二 图形的控制与表现 1
  • spring-MVC__spring__hibernate整合值hibernate的配置文件 (hibernate.cfg.xml)

  • QT-样式表

    Qt样式表是一个可以自定义部件外观的十分强大的机制 除了那些能够通过子类化QStyle更改的外观 其余的都可以使用Qt样式表来美化 Qt样式表的概念 术语和语法都受到了HTML的层叠样式表 Cascading Style Sheets CS
  • Ubuntu使用darknet实现YOLOv4-tiny预训练模型测试+训练自己的数据集+评估自己的模型

    文章目录 1 使用YOLOv4 tiny预训练模型 2 训练自己的数据集 2 1 建立yolov4 tiny数据格式 2 2 开始训练 2 3 多GPU训练 3 评估自己的模型 参考博客 YOLOv4 tiny的原理本文不做讲解 只有应用方
  • 黑马程序员SSM-Spring学习笔记

    学完Spring之后是SpringMVC 文章目录 前言 一 注解开发 1 1 注解开发定义bean 1 2纯注解开发 1 3bean作用范围 1 4依赖注入 自动装配 1 5 第三方bean管理 1 6 总结 二 Spring整合MyBa