Spring学习笔记1

目录

  • 1 什么是spring
  • 2 spring的优势
  • 3 IOC的概念和作用
    • 3.1 无参数构造函数的实例化方式
    • 3.2 使用工厂中的普通方法实例化对象
  • 4 Bean
    • 4.1 Bean相关概念
    • 4.2 Bean对象的作用范围
  • 5 DI
    • 5.1 构造函数注入
    • 5.2 set方法注入
    • 5.3 复杂类型数据注入
    • 5.4 基于注解的IOC
      • 5.4.1 包扫描
      • 5.4.2 @Component
      • 5.4.3 由Component衍生的注解
      • 5.4.4 @Autowired
      • 5.4.5 其他注入数据的注解
  • 6 配置类
      • 6.1. `@Configuration` 注解
      • 6.2 `@Import` 注解
      • 6.3 `@PropertySource` 注解
      • 6.4 综合示例

1 什么是spring

Spring 是一个开源的 Java 应用框架,旨在简化企业级应用开发。它利用依赖注入(DI)和面向切面编程(AOP)减少代码耦合,提升可测试性和维护性。Spring 核心容器管理应用对象的生命周期和配置。

2 spring的优势

  1. 简化开发:通过依赖注入(DI)和面向切面编程(AOP),Spring 让代码更加模块化、解耦,减少了样板代码,提升了开发效率。

  2. 灵活性:Spring 提供了多种配置方式(注解、XML、JavaConfig),支持多种持久化框架和第三方库集成,适应不同的应用需求。

  3. 测试友好:依赖注入让单元测试和集成测试更加简便,无需依赖运行环境即可快速测试业务逻辑。

  4. 生态丰富:Spring 有强大的生态系统,包括 Spring Boot(简化配置和部署)、Spring Security(提供安全管理)、Spring Cloud(微服务支持)等,能够满足复杂的应用场景。

  5. 轻量级:Spring 的核心容器是小巧的,开发者可以选择性地使用需要的模块,避免不必要的依赖。

3 IOC的概念和作用

3.1 无参数构造函数的实例化方式

创建一个XML配置文件(例如 applicationContext.XML)

<bean id="userService" class="com.example.UserService"/>

使用Spring的ApplicationContext加载XML配置文件

 	// 加载 Spring XML 配置文件
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    // 获取 Bean
    UserService userService = (UserService) context.getBean("userService");

3.2 使用工厂中的普通方法实例化对象

首先,创建一个工厂类,其中包含一个普通方法来创建 Bean 实例。

package com.example;

public class UserFactory {
    public UserService createUserService() {
        return new UserService();
    }
}

在 Spring 的 XML 配置文件中,配置工厂 Bean 和使用工厂方法来创建 Bean。

   <!-- 定义工厂 Bean -->
   <bean id="userFactory" class="com.example.UserFactory"/>
   <!-- 使用工厂方法来创建 Bean -->
   <bean id="userService" factory-bean="userFactory" factory-method="createUserService"/>

4 Bean

4.1 Bean相关概念

  1. Bean: 在计算机英语中,有可重用组件(如持久层和业务层的接口和重用)的含义。

  2. JavaBean: 其实JavaBean并不完全等于实体类,因为实体类只是可重用组件的一部分,也就是JavaBean的范围大于实体类的范围。

JavaBean的含义:用Java语言编写的可重用组件。

4.2 Bean对象的作用范围

bean标签的scope属性,

作用:用于指定bean的作用范围

取值:

  • singleton:单例的(默认值)

  • prototype:多例的

  • ···等

5 DI

依赖注入:Dependency Injection

5.1 构造函数注入

bean标签内部的constructor-arg标签

标签中的属性:

  • name:用于给构造函数中指定名称的参数赋值
  • value:用于提供标准类型和String类型的数据
  • ref:用于指定其他的bean类型数据(就是在ioc容器中出现过的bean对象)

需要提供一个含参数的构造器

public class Account{
    private Integer id;
    private String name;
    
    public Account(Integer id,String name){
        this.id = id;
        this.name = name;
    }
}
<bean id = "account" class = "com.example.Account">
	<constructor-arg name = "id" value = 10></constructor-arg>
	<constructor-arg name = "name" value ="张三"></constructor-arg>
</bean>

5.2 set方法注入

bean标签内部的property标签

标签的属性:

  • name:用于给构造函数中指定名称的参数赋值
  • value:用于提供标准类型和String类型的数据
  • ref:用于指定其他的bean类型数据(就是在ioc容器中出现过的bean对象)

需要提供set方法

public class Account{
    private Integer id;
    private String name;
    
	public void setId(Integer id){
        this.id = id;
    }
    public void setName(String name){
        this.name = name;
    }
}
<bean id="account" class="com.example.Account">
	<property name = "id" value = 10></property>
	<property name = "name" value ="张三"></property>
</bean>

5.3 复杂类型数据注入

在 Spring 框架中,除了注入简单的类型(如 Stringint 等),还可以注入复杂类型的数据,例如 ListSetMapProperties。这些复杂类型的数据可以通过 property 标签及其子标签来配置。

package com.example;
public class UserService {

    private List<String> emails;
    private Set<String> phoneNumbers;
    private Map<String, String> userRoles;
    private Properties props;

    public void setEmails(List<String> emails) {
        this.emails = emails;
    }

    public void setPhoneNumbers(Set<String> phoneNumbers) {
        this.phoneNumbers = phoneNumbers;
    }

    public void setUserRoles(Map<String, String> userRoles) {
        this.userRoles = userRoles;
    }

    public void setProps(Properties props) {
        this.props = props;
    }
}
    <bean id="userService" class="com.example.UserService">
        <!-- 注入 List -->
        <property name="emails">
            <list>
                <value>john@example.com</value>
                <value>jane@example.com</value>
            </list>
        </property>

        <!-- 注入 Set -->
        <property name="phoneNumbers">
            <set>
                <value>+123456789</value>
                <value>+987654321</value>
            </set>
        </property>

        <!-- 注入 Map -->
        <property name="userRoles">
            <map>
                <entry key="john" value="admin"/>
                <entry key="jane" value="user"/>
            </map>
        </property>

        <!-- 注入 Properties -->
        <property name="props">
            <props>
                <prop key="language">English</prop>
                <prop key="country">USA</prop>
            </props>
        </property>
    </bean>

</beans>

5.4 基于注解的IOC

5.4.1 包扫描

使用注解时要告知spring在创建容器时要扫描的包

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

5.4.2 @Component

  • 用法:定义在类名上

  • 作用:用于把当前类对象存入spring容器中

  • 属性:value:用于指定bean的id,默认值是类名(首字母小写)

5.4.3 由Component衍生的注解

  • @Controller:一般用在表现层
  • @Service:一般用在业务
  • @Repository:一般用在持久层

这三个注解他们的作用和属性与@Component相同,他们三个是spring框架为我们提供明确的三层使用的注解。

5.4.4 @Autowired

@Autowired 是 Spring 框架中用于实现依赖注入(Dependency Injection, DI)的核心注解之一。它可以自动将 Spring 容器中匹配的 Bean 注入到需要的地方。@Autowired 可以用于构造函数、字段、setter 方法或任意方法。

@Autowired 的详细使用

  1. 字段注入

这是最常见的方式,直接在字段上使用 @Autowired 注解,Spring 会自动将匹配的 Bean 注入到该字段。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public void displayUser() {
        userRepository.findUser();
    }
}
  1. 构造函数注入

在构造函数上使用 @Autowired 注解,Spring 会在实例化时通过构造函数注入依赖。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class UserService {

    private final UserRepository userRepository;

    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void displayUser() {
        userRepository.findUser();
    }
}
  1. Setter 方法注入

通过在 setter 方法上使用 @Autowired 注解,Spring 会在 Bean 创建后调用该方法完成注入。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class UserService {

    private UserRepository userRepository;

    @Autowired
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void displayUser() {
        userRepository.findUser();
    }
}
  1. 任意方法注入

除了构造函数和 setter 方法,@Autowired 还可以用在任意方法上。Spring 会在 Bean 创建后调用该方法完成注入。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class UserService {

    private UserRepository userRepository;

    @Autowired
    public void arbitraryMethod(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void displayUser() {
        userRepository.findUser();
    }
}
  1. 默认行为与 @Autowired 的要求
  • 默认行为@Autowired 注解默认采用 byType 的方式进行注入。如果找到多个匹配的 Bean,Spring 会尝试根据 @Qualifier 注解进一步确定要注入的 Bean。
  • 必填性:默认情况下,@Autowired 是必填的(required=true),即 Spring 必须找到一个匹配的 Bean,否则会抛出 NoSuchBeanDefinitionException 异常。
  • 非必填性:可以通过设置 @Autowired(required = false) 来使依赖成为可选的,这样如果找不到匹配的 Bean,Spring 将不会注入任何东西。

5.4.5 其他注入数据的注解

@Qualifier@Resource@Value 都是 Spring 框架中用于依赖注入(Dependency Injection, DI)的注解,但它们的用途和使用场景有所不同。

  1. @Qualifier

@Qualifier 注解用于在多个相同类型的 Bean 中指定注入哪一个具体的 Bean。它通常与 @Autowired 一起使用。

使用场景

当有多个相同类型的 Bean 存在时,Spring 无法确定注入哪一个 Bean,这时可以使用 @Qualifier 注解来指定具体的 Bean。

示例

假设我们有两个实现 UserRepository 接口的 Bean:

import org.springframework.stereotype.Repository;

@Repository("primaryUserRepository")
public class PrimaryUserRepository implements UserRepository {
    // 实现
}

@Repository("secondaryUserRepository")
public class SecondaryUserRepository implements UserRepository {
    // 实现
}

UserService 中,我们可以使用 @Qualifier 注解来指定注入 secondaryUserRepository

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component
public class UserService {

    private final UserRepository userRepository;

    @Autowired
    public UserService(@Qualifier("secondaryUserRepository") UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void displayUser() {
        userRepository.findUser();
    }
}
  1. @Resource

@Resource 注解是 Java 的标准注解(JSR-250),用于依赖注入。它可以根据名称或类型进行注入。默认情况下,@Resource 是按名称注入的,如果没有找到匹配的名称,则按类型注入。

使用场景

@Resource 注解通常用于按名称注入 Bean,如果不指定名称,则会使用默认的名称(即字段名)。

示例

假设我们有两个实现 UserRepository 接口的 Bean:

import org.springframework.stereotype.Repository;

@Repository("primaryUserRepository")
public class PrimaryUserRepository implements UserRepository {
    // 实现
}

@Repository("secondaryUserRepository")
public class SecondaryUserRepository implements UserRepository {
    // 实现
}

UserService 中,我们可以使用 @Resource 注解来指定注入 secondaryUserRepository

import javax.annotation.Resource;
import org.springframework.stereotype.Component;

@Component
public class UserService {

    @Resource(name = "secondaryUserRepository")
    private UserRepository userRepository;

    public void displayUser() {
        userRepository.findUser();
    }
}
  1. @Value

@Value 注解用于注入配置文件中的值或直接注入字符串、数字等常量值。它通常用于注入简单的属性,例如字符串、数字、布尔值等。

使用场景

@Value 注解通常用于注入配置文件中的属性值,或者直接注入常量值。

示例

假设我们在 application.properties 文件中定义了一个属性:

app.name=MyApplication

UserService 中,我们可以使用 @Value 注解来注入这个属性值:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class UserService {

    @Value("${app.name}")
    private String appName;

    public void displayAppName() {
        System.out.println("Application Name: " + appName);
    }
}

我们也可以直接注入常量值:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class UserService {

    @Value("Hello, World!")
    private String greeting;

    public void displayGreeting() {
        System.out.println(greeting);
    }
}

4.@Scope

@Scope 是 Spring 框架中的一个注解,用于定义 Bean 的作用域。Bean 的作用域决定了 Bean 的生命周期以及 Spring 容器如何管理 Bean 的实例。通过 @Scope 注解,你可以指定 Bean 在应用中的生命周期和可访问范围。

常见的作用域

  1. singleton(单例)

    • 描述:这是 Spring 的默认作用域。在单例作用域中,每个 Spring IoC 容器仅创建一个 Bean 实例,并且所有对 Bean 的请求都会共用这一个实例。
    • 适用场景:大多数无状态的 Bean 都适合使用单例作用域。
  2. prototype(原型)

    • 描述:每次请求都会创建一个新的 Bean 实例。
    • 适用场景:当 Bean 是有状态的,即每个实例需要独立的状态时,应使用原型作用域。
  3. request(请求)

    • 描述:在 Web 应用中,每个 HTTP 请求都会创建一个 Bean 实例。该 Bean 只在当前 HTTP 请求内有效。
    • 适用场景:需要在单个 HTTP 请求中维护状态的 Bean。
  4. session(会话)

    • 描述:在 Web 应用中,每个 HTTP Session 都会创建一个 Bean 实例。该 Bean 只在当前 HTTP Session 内有效。
    • 适用场景:需要在用户 Session 范围内维护状态的 Bean。
  5. application(应用)

    • 描述:在 Web 应用中,每个 ServletContext(即整个应用)只有一个 Bean 实例。该 Bean 在整个应用范围内有效。
    • 适用场景:需要在应用范围内共享数据的 Bean。
  6. websocket(WebSocket)

    • 描述:在 Web 应用中,每个 WebSocket 连接都会创建一个 Bean 实例。该 Bean 只在当前 WebSocket 连接内有效。
    • 适用场景:需要在 WebSocket 连接范围内维护状态的 Bean。

使用 @Scope 注解

你可以使用 @Scope 注解来显式地指定 Bean 的作用域。以下是一些示例:

Singleton Scope

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

@Component
@Scope("singleton")
public class SingletonBean {
    // Bean implementation
}

6 配置类

好的,@Configuration@Import@PropertySource 是 Spring 框架中常用的注解,分别用于配置类、模块化配置和外部属性文件的加载。下面分别介绍这三个注解的用途和使用方法。

6.1. @Configuration 注解

@Configuration 注解用于标记一个类为 Spring 配置类。配置类中可以定义 @Bean 注解的方法,用于创建和配置 Spring 容器中的 Bean。配置类可以替代传统的 XML 配置文件。

特点

  • 替代 XML 配置:使用 Java 代码代替 XML 文件进行配置。
  • 集中管理 Bean:在一个类中定义多个 Bean,方便管理。
  • 支持依赖注入:可以在配置类中注入其他 Bean。

示例

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {

    @Bean
    public MyBean myBean() {
        return new MyBean();
    }
}

6.2 @Import 注解

@Import 注解用于将一个或多个配置类导入到当前配置类中。通过 @Import,可以实现模块化配置,将多个配置类组合在一起。

特点

  • 模块化配置:将多个配置类组合在一起,便于管理和维护。
  • 代码复用:可以在多个配置类中导入相同的配置类,避免重复代码。

示例

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@Import({DatabaseConfig.class, ServiceConfig.class})
public class AppConfig {
    // 其他 Bean 定义
}

6.3 @PropertySource 注解

@PropertySource 注解用于加载外部属性文件(如 .properties.yml 文件),并将其中的属性值注入到 Spring 环境中。通常与 @Value@ConfigurationProperties 注解一起使用。

特点

  • 加载外部属性文件:支持加载 .properties.yml 文件。
  • 动态配置:可以通过属性文件动态配置应用的行为。
  • 支持多文件:可以加载多个属性文件。

示例

属性文件 app.properties

app.name=MyApp
app.version=1.0

配置类

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration
@PropertySource("classpath:app.properties")
public class AppConfig {

    @Value("${app.name}")
    private String appName;

    @Value("${app.version}")
    private String appVersion;

    public void printAppInfo() {
        System.out.println("App Name: " + appName);
        System.out.println("App Version: " + appVersion);
    }
}

6.4 综合示例

以下是一个综合使用 @Configuration@Import@PropertySource 的示例:

  1. 属性文件 database.properties
db.url=jdbc:mysql://localhost:3306/mydb
db.username=root
db.password=secret
  1. 配置类 DatabaseConfig
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration
@PropertySource("classpath:database.properties")
public class DatabaseConfig {

    @Value("${db.url}")
    private String dbUrl;

    @Value("${db.username}")
    private String dbUsername;

    @Value("${db.password}")
    private String dbPassword;

    @Bean
    public DataSource dataSource() {
        // 使用属性值创建数据源
        return new DataSource(dbUrl, dbUsername, dbPassword);
    }
}
  1. 配置类 ServiceConfig
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ServiceConfig {

    @Bean
    public MyService myService() {
        return new MyService();
    }
}
  1. 主配置类 AppConfig
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@Import({DatabaseConfig.class, ServiceConfig.class})
public class AppConfig {
    // 其他 Bean 定义
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/951314.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

opencv的NLM去噪算法

NLM&#xff08;Non-Local Means&#xff09;去噪算法是一种基于图像块&#xff08;patch&#xff09;相似性的去噪方法。其基本原理是&#xff1a; 图像块相似性&#xff1a;算法首先定义了一个搜索窗口&#xff08;search window&#xff09;&#xff0c;然后在该窗口内寻找…

NineData云原生智能数据管理平台新功能发布|2024年12月版

本月发布 7 项更新&#xff0c;其中重点发布 2 项、功能优化 5 项。 重点发布 数据库 Devops - Oracle 非表对象支持可视化创建与管理 Oracle 非表对象&#xff0c;包括视图&#xff08;View&#xff09;、包&#xff08;Package&#xff09;、存储过程&#xff08;Procedur…

计算机网络 —— 网络编程(TCP)

计算机网络 —— 网络编程&#xff08;TCP&#xff09; TCP和UDP的区别TCP (Transmission Control Protocol)UDP (User Datagram Protocol) 前期准备listen &#xff08;服务端&#xff09;函数原型返回值使用示例注意事项 accpect &#xff08;服务端&#xff09;函数原型返回…

eNSP之家----ACL实验入门实例详解(Access Control List访问控制列表)(重要重要重要的事说三遍)

ACL实验&#xff08;Access Control List访问控制列表&#xff09;是一种基于包过滤的访问控制技术&#xff0c;它可以根据设定的条件对接口上的数据包进行过滤&#xff0c;允许其通过或丢弃。访问控制列表被广泛地应用于路由器和三层交换机。 准备工作 在eNSP里面部署设备&a…

PySide6基于QSlider实现QDoubleSlider

我在写小工具的时候&#xff0c;需要一个支持小数的滑动条。 我QSpinBox都找到了QDoubleSpinBox&#xff0c;QSlider愣是没找到对应的东西。 网上有好多对QSlider封装实现QDoubleSlider的文章。 似乎Qt真的没有这个东西&#xff0c;需要我们自行实现。 于是我也封装了一个&…

即插即用,无缝集成各种模型,港科大蚂蚁等发布Edicho:图像编辑一致性最新成果!

文章链接&#xff1a;https://arxiv.org/pdf/2412.21079 项目链接&#xff1a;https://ezioby.github.io/edicho/ 亮点直击 显式对应性引导一致性编辑&#xff1a;通过将显式图像对应性融入扩散模型的去噪过程&#xff0c;改进自注意力机制与分类器自由引导&#xff08;CFG&…

福建双色荷花提取颜色

提取指定颜色 HSV双色荷花代码验证 参照《OpenCV图像处理技术》 HSV 要用HSV的色调、饱和度和亮度来提取指定颜色。 双色荷花 农林大学金山校区观音湖 代码 import cv2 import numpy as npimgcv2.imread("./sucai6/hua.jpg") cv2.imshow("SRC",img) h…

关于重构一点简单想法

关于重构一点简单想法 当前工作的组内&#xff0c;由于业务开启的时间正好处于集团php-》go技术栈全面迁移的时间点&#xff0c;组内语言技术栈存在&#xff1a;php、go两套。 因此需求开发过程中通常要考虑两套技术栈的逻辑&#xff0c;一些基础的逻辑也没有办法复用。 在这…

【操作系统】课程 7设备管理 同步测练 章节测验

7.1知识点导图 它详细地展示了I/O系统的层次结构、I/O硬件和软件的组成以及它们的功能。下面是对图中内容的文字整理&#xff1a; I/O设备分类 按使用特性分类 输入设备&#xff1a;键盘、鼠标等输出设备&#xff1a;打印机、绘图仪等交互式设备&#xff1a;显示器等 按传输速率…

用 Python 绘制可爱的招财猫

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​​​​ ​​​​​​​​​ ​​​​ 招财猫&#xff0c;也被称为“幸运猫”&#xff0c;是一种象征财富和好运的吉祥物&#xff0c;经常…

【Vue.js 组件化】高效组件管理与自动化实践指南

文章目录 摘要引言组件命名规范与组织结构命名规范目录组织 依赖管理工具自动化组件文档生成构建自动引入和文档生成的组件化体系代码结构自动引入组件配置使用 Storybook 展示组件文档自动生成 代码详解QA 环节总结参考资料 摘要 在现代前端开发中&#xff0c;组件化管理是 V…

4.5 在C++节点中使用参数

本节沿用之前4.3 节小海龟控制例子。 4.5.1 参数声明与设置 打开src/demo_cpp_service/src/turtle_control.cpp文件 添加测试代码 this->declare_parameter("k",1.0);this->declare_parameter("max_speed",1.0);this->get_parameter("k&q…

Java agent

‌ Java Agent是一种特殊的Java程序&#xff0c;它可以在JVM启动时或运行时动态加载&#xff0c;用于监控和修改其他Java应用程序的行为‌。通过Java Agent&#xff0c;开发者可以在不修改目标应用程序源码的情况下&#xff0c;动态地插入功能&#xff0c;如性能分析、日志记录…

Cannot run program “docker“: CreateProcess error=2,系统找不到指定的文件

今天被这个问题坑了, 网上教程全是直接装插件就行 ,结果我连接可以成功 但是执行docker compose 就会出错, 检测配置 报错com.intellil,execution,process.ProcessNotCreatedException: Cannot run program “docker”: CreateProcess error2,系统找不到指定的文件 gpt 要我去…

二、模型训练与优化(4):模型优化-实操

下面我将以 MNIST 手写数字识别模型为例&#xff0c;从 剪枝 (Pruning) 和 量化 (Quantization) 两个常用方法出发&#xff0c;提供一套可实际动手操作的模型优化流程。此示例基于 TensorFlow/Keras 环境&#xff0c;示范如何先训练一个基础模型&#xff0c;然后对其进行剪枝和…

免费图片批量压缩工具-支持批量修改分辨率

工作需求&#xff0c;需要支持修改分辨率上限的同时进行图片压缩&#xff0c;设计此工具。 1.支持批量文件夹、子文件 2.支持最大分辨率上限&#xff08;高于设定分辨率的图片&#xff0c;强制修改为指定分辨率&#xff0c;解决大图的关键&#xff09; 3.自定义压缩质量&#x…

Github上传项目

写在前面&#xff1a; 本次博客仅仅是个人学习记录&#xff0c;不具备教学作用。内容整理来自网络&#xff0c;太多了&#xff0c;所以就不放来源了。 在github页面的准备&#xff1a; 输入标题。 往下滑&#xff0c;创建 创建后会跳出下面的页面 进入home就可以看到我们刚…

并发编程 之 Java内存模型(详解)

Java 内存模型&#xff08;JMM&#xff0c;Java Memory Model&#xff09;可以说是并发编程的基础&#xff0c;跟众所周知的Java内存区域(堆、栈、程序计数器等)并不是一个层次的划分&#xff1b; JMM用来屏蔽各种硬件和操作系统的内存访问差异&#xff0c;以实现让Java程序在各…

[QCustomPlot] 交互示例 Interaction Example

本文是官方例子的分析: Interaction Example 推荐笔记: qcustomplot使用教程–基本绘图 推荐笔记: 4.QCustomPlot使用-坐标轴常用属性 官方例子需要用到很多槽函数, 这里先一次性列举, 自行加入到qt的.h中.下面开始从简单的开始一个个分析. void qcustomplot_main_init(void); …

WPF控件Grid的布局和C1FlexGrid的多选应用

使用 Grid.Column和Grid.Row布局&#xff0c;将多个C1FlexGrid布局其中&#xff0c;使用各种事件来达到所需效果&#xff0c;点击复选框可以加载数据到列表&#xff0c;移除列表的数据&#xff0c;自动取消复选框等 移除复选框的要注意&#xff01;&#xff01;&#xff01;&am…