Spring Boot自动配置原理:如何实现零配置启动

引言

在现代软件开发中,Spring 框架已经成为 Java 开发领域不可或缺的一部分。而 Spring Boot 的出现,更是为 Spring 应用的开发带来了革命性的变化。Spring Boot 的核心优势之一就是它的“自动配置”能力,它极大地简化了 Spring 应用的配置过程,使得开发者可以专注于业务逻辑的实现,而无需花费大量时间在繁琐的配置文件上。本文将深入探讨 Spring Boot 自动配置的原理,分析它是如何实现“零配置启动”的,并通过实际代码示例帮助读者更好地理解和应用这一强大特性。

一、Spring Boot 自动配置的背景与意义

(一)传统 Spring 应用的配置痛点

在传统 Spring 应用开发中,开发者需要手动配置大量的 XML 文件或注解,以完成诸如 Bean 的定义、组件扫描、事务管理、数据源配置等任务。例如,一个简单的 Spring MVC 应用可能需要以下配置:

  1. XML 配置文件:定义 Bean、数据源、事务管理器等。

  2. 注解配置:使用 @Configuration@Component@Service 等注解来声明组件。

  3. 环境配置:配置数据库连接信息、外部服务地址等。

这种配置方式不仅繁琐,而且容易出错,尤其是对于新手开发者来说,学习成本较高。此外,随着项目规模的扩大,配置文件的维护也变得越来越复杂。

(二)Spring Boot 的设计理念

Spring Boot 的核心设计理念是“约定大于配置”(Convention over Configuration)。它通过一系列默认的配置和自动配置机制,使得开发者只需要遵循 Spring Boot 的约定,即可快速启动和运行一个 Spring 应用,而无需手动编写大量的配置代码。这种设计理念不仅提高了开发效率,还降低了开发门槛,使得 Spring 框架更加易于上手和使用。

(三)自动配置的目标

Spring Boot 的自动配置目标是实现“零配置启动”,即开发者无需编写任何配置代码,只需引入相关的依赖,Spring Boot 就会自动完成所有必要的配置。例如,当开发者引入了 Spring Boot 的 Web 依赖后,Spring Boot 会自动配置一个嵌入式的 Tomcat 容器,并完成 Spring MVC 的初始化。

二、Spring Boot 自动配置的核心机制

(一)@SpringBootApplication 注解

@SpringBootApplication 是 Spring Boot 应用的核心注解,它是一个组合注解,包含了以下三个注解:

  1. @SpringBootConfiguration:标识当前类是一个 Spring Boot 配置类。

  2. @EnableAutoConfiguration:启用 Spring Boot 的自动配置机制。

  3. @ComponentScan:启用组件扫描,扫描当前包及其子包中的组件。

java复制

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = { @Filter(type = FilterType.CUSTOM, value = TypeExcludeFilter.class), 
                       @Filter(type = FilterType.CUSTOM, value = AutoConfigurationExcludeFilter.class) }
)
public @interface SpringBootApplication {
}

通过 @SpringBootApplication 注解,开发者只需要在主类上添加一个注解,即可启动 Spring Boot 的自动配置机制。

(二)@EnableAutoConfiguration 注解

@EnableAutoConfiguration 是自动配置的核心注解,它通过 @Import(AutoConfigurationImportSelector.class) 导入了一个特殊的类 AutoConfigurationImportSelectorAutoConfigurationImportSelector 是一个 DeferredImportSelector,它会在 Spring 容器启动时,根据项目中引入的依赖和类路径中的资源,动态地选择并导入一系列的自动配置类。

java复制

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
}

(三)AutoConfigurationImportSelector

AutoConfigurationImportSelector 是自动配置的入口类,它通过以下步骤实现自动配置:

  1. 加载配置类列表:通过 SpringFactoriesLoader 加载 META-INF/spring.factories 文件中定义的自动配置类。

  2. 过滤配置类:根据项目中引入的依赖和类路径中的资源,过滤掉不适用的配置类。

  3. 导入配置类:将过滤后的配置类导入到 Spring 容器中。

AutoConfigurationImportSelector 的核心方法是 getCandidateConfigurations,它会加载并返回所有候选的自动配置类。

java复制

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
    List<String> configurations = SpringFactoriesLoader.loadFactoryNames(
        getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());
    Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. "
        + "If you are using a custom packaging, make sure that file is correct.");
    return configurations;
}

(四)spring.factories 文件

spring.factories 文件是 Spring Boot 自动配置的关键。它位于 META-INF 目录下,是一个普通的文本文件,用于定义自动配置类的列表。例如,Spring Boot 的 Web 模块会在 spring.factories 文件中定义以下内容:

properties复制

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration

当 Spring Boot 启动时,AutoConfigurationImportSelector 会加载 spring.factories 文件中定义的配置类,并根据条件过滤后导入到 Spring 容器中。

(五)条件注解

Spring Boot 的自动配置机制依赖于条件注解来实现动态配置。条件注解允许开发者根据特定的条件来决定是否加载某个配置类或 Bean。Spring Boot 提供了一系列内置的条件注解,例如:

  1. @ConditionalOnClass:当指定的类在类路径中时,条件成立。

  2. @ConditionalOnMissingBean:当容器中没有指定的 Bean 时,条件成立。

  3. @ConditionalOnProperty:当指定的属性存在且满足特定值时,条件成立。

  4. @ConditionalOnWebApplication:当应用是一个 Web 应用时,条件成立。

这些条件注解使得 Spring Boot 能够根据项目的实际情况动态地选择和加载配置类。例如,WebMvcAutoConfiguration 类上使用了 @ConditionalOnWebApplication 注解,只有当应用是一个 Web 应用时,才会加载该配置类。

java复制

@Configuration(proxyBeanMethods = false)
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {
}

三、Spring Boot 自动配置的实现过程

(一)启动流程

当 Spring Boot 应用启动时,@SpringBootApplication 注解会触发自动配置机制。以下是自动配置的启动流程:

  1. 加载 spring.factories 文件AutoConfigurationImportSelector 通过 SpringFactoriesLoader 加载 META-INF/spring.factories 文件中定义的自动配置类。

  2. 过滤配置类:根据条件注解过滤掉不适用的配置类。

  3. 导入配置类:将过滤后的配置类导入到 Spring 容器中。

  4. 初始化 Bean:Spring 容器根据导入的配置类初始化相关的 Bean。

(二)自动配置类的加载

自动配置类的加载是通过 SpringFactoriesLoader 实现的。SpringFactoriesLoader 是 Spring 框架提供的一个工具类,用于加载 META-INF/spring.factories 文件中定义的类。以下是加载过程的代码示例:

java复制

public static List<String> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader) {
    String factoryTypeName = factoryType.getName();
    return loadSpringFactories(classLoader).getOrDefault(factoryTypeName, Collections.emptyList());
}

private static Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader) {
    MultiValueMap<String, String> result = Cache.value();
    if (result != null) {
        return result;
    }

    result = new LinkedMultiValueMap<>();
    try {
        Enumeration<URL> urls = (classLoader != null ? classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :
            ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));
        List<Properties> factoryFiles = new ArrayList<>();
        while (urls.hasMoreElements()) {
            URL url = urls.nextElement();
            UrlResource resource = new UrlResource(url);
            Properties properties = PropertiesLoaderUtils.loadProperties(resource);
            factoryFiles.add(properties);
        }
        for (Properties properties : factoryFiles) {
            properties.forEach((key, value) -> {
                String factoryClassName = asString(value);
                result.add(asString(key), factoryClassName);
            });
        }
    } catch (IOException ex) {
        throw new IllegalArgumentException("Unable to load factories from location [" + FACTORIES_RESOURCE_LOCATION + "]", ex);
    }
    Cache.cacheValue(result);
    return result;
}

(三)条件注解的过滤

条件注解的过滤是通过 ConditionEvaluator 实现的。ConditionEvaluator 是 Spring Boot 提供的一个工具类,用于评估条件注解是否成立。以下是条件注解的过滤过程:

  1. 解析条件注解ConditionEvaluator 解析配置类上的条件注解。

  2. 评估条件:根据条件注解的规则,评估条件是否成立。

  3. 过滤配置类:如果条件不成立,则过滤掉该配置类。

例如,@ConditionalOnClass 注解的评估逻辑如下:

java复制

public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
    ClassLoader classLoader = context.getClassLoader();
    if (classLoader == null) {
        return false;
    }
    String[] classes = metadata.getAllAnnotationAttributes(ConditionalOnClass.class.getName(), false).get("value").getArrayValue();
    for (String className : classes) {
        if (!ClassUtils.isPresent(className, classLoader)) {
            return false;
        }
    }
    return true;
}

(四)配置类的导入

过滤后的配置类会被导入到 Spring 容器中。Spring 容器会根据配置类中的定义初始化相关的 Bean。例如,WebMvcAutoConfiguration 类会初始化 Spring MVC 的相关 Bean,包括 DispatcherServletRequestMappingHandlerMapping 等。

java复制

@Bean(name = DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_BEAN_NAME)
@ConditionalOnBean(DispatcherServlet.class)
@ConditionalOnMissingBean(name = DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_BEAN_NAME, value = DispatcherServlet.class)
public DispatcherServlet dispatcherServlet(DispatcherServlet dispatcherServlet) {
    return dispatcherServlet;
}

四、Spring Boot 自动配置的实践案例

(一)Web 应用的自动配置

当开发者引入了 Spring Boot 的 Web 依赖后,Spring Boot 会自动配置一个嵌入式的 Tomcat 容器,并完成 Spring MVC 的初始化。以下是 Web 应用的自动配置过程:

  1. 加载 spring.factories 文件AutoConfigurationImportSelector 加载 META-INF/spring.factories 文件中定义的自动配置类,包括 WebMvcAutoConfigurationServletWebServerFactoryAutoConfiguration 等。

  2. 过滤配置类:根据条件注解过滤掉不适用的配置类。例如,@ConditionalOnWebApplication 注解会过滤掉非 Web 应用的配置类。

  3. 导入配置类:将过滤后的配置类导入到 Spring 容器中。

  4. 初始化 Bean:Spring 容器根据导入的配置类初始化相关的 Bean,包括 DispatcherServletRequestMappingHandlerMapping 等。

(二)数据源的自动配置

当开发者引入了 Spring Boot 的数据源依赖后,Spring Boot 会自动配置一个数据源,并完成 JPA 或 MyBatis 的初始化。以下是数据源的自动配置过程:

  1. 加载 spring.factories 文件AutoConfigurationImportSelector 加载 META-INF/spring.factories 文件中定义的自动配置类,包括 DataSourceAutoConfigurationJpaAutoConfiguration 等。

  2. 过滤配置类:根据条件注解过滤掉不适用的配置类。例如,@ConditionalOnClass 注解会过滤掉没有引入相关依赖的配置类。

  3. 导入配置类:将过滤后的配置类导入到 Spring 容器中。

  4. 初始化 Bean:Spring 容器根据导入的配置类初始化相关的 Bean,包括 DataSourceEntityManagerFactory 等。

(三)自定义自动配置

开发者可以通过创建自己的自动配置类来扩展 Spring Boot 的自动配置机制。以下是自定义自动配置的步骤:

  1. 创建自动配置类:创建一个带有 @Configuration 注解的类,并在类上添加条件注解。

  2. 定义 Bean:在自动配置类中定义相关的 Bean。

  3. 注册到 spring.factories 文件:将自定义的自动配置类添加到 META-INF/spring.factories 文件中。

例如,创建一个自定义的自动配置类 MyAutoConfiguration

java复制

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(MyService.class)
public class MyAutoConfiguration {

    @Bean
    public MyService myService() {
        return new MyService();
    }
}

META-INF/spring.factories 文件中添加以下内容:

properties复制

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.MyAutoConfiguration

五、Spring Boot 自动配置的优势与局限性

(一)优势

  1. 简化配置:Spring Boot 的自动配置机制极大地简化了 Spring 应用的配置过程,开发者无需手动编写大量的配置代码。

  2. 提高效率:开发者可以专注于业务逻辑的实现,而无需花费大量时间在配置文件的维护上。

  3. 易于上手:Spring Boot 的自动配置机制使得 Spring 框架更加易于上手和使用,降低了开发门槛。

  4. 动态配置:通过条件注解,Spring Boot 能够根据项目的实际情况动态地选择和加载配置类,提高了配置的灵活性。

(二)局限性

  1. 配置覆盖:虽然 Spring Boot 提供了大量的默认配置,但在某些情况下,开发者可能需要手动覆盖默认配置。

  2. 复杂项目:对于一些复杂的项目,自动配置可能无法完全满足需求,开发者需要手动进行一些配置。

  3. 性能问题:自动配置机制会加载和评估大量的配置类,可能会影响应用的启动性能。

六、如何优化 Spring Boot 自动配置

(一)自定义配置

开发者可以通过创建自定义的配置类来覆盖 Spring Boot 的默认配置。例如,自定义数据源配置:

java复制

@Configuration
public class DataSourceConfig {

    @Bean
    public DataSource dataSource() {
        return new HikariDataSource();
    }
}

(二)禁用自动配置

开发者可以通过在 application.properties 文件中设置 spring.autoconfigure.exclude 属性来禁用某些自动配置类。例如:

properties复制

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

(三)优化启动性能

开发者可以通过以下方式优化 Spring Boot 的启动性能:

  1. 减少依赖:只引入项目中实际需要的依赖,避免引入不必要的依赖。

  2. 延迟加载:通过 @Lazy 注解延迟加载某些 Bean,减少启动时的初始化开销。

  3. 优化配置:通过自定义配置类优化自动配置的性能。

七、总结

Spring Boot 的自动配置机制是其核心特性之一,它通过一系列默认的配置和动态的条件注解,极大地简化了 Spring 应用的配置过程,实现了“零配置启动”。开发者只需引入相关的依赖,Spring Boot 就会自动完成所有必要的配置。通过本文的介绍,读者应该对 Spring Boot 自动配置的原理有了深入的理解,并能够通过实践案例更好地应用这一强大特性。

然而,Spring Boot 的自动配置机制也存在一些局限性。在某些情况下,开发者可能需要手动覆盖默认配置或禁用某些自动配置类。此外,自动配置机制可能会对应用的启动性能产生一定的影响。因此,开发者需要根据项目的实际情况,合理地使用和优化 Spring Boot 的自动配置机制,以充分发挥其优势。

总之,Spring Boot 的自动配置机制为 Spring 应用的开发带来了极大的便利,它不仅提高了开发效率,还降低了开发门槛。随着 Spring Boot 的不断发展和完善,我们有理由相信它将在未来的 Java 开发领域中发挥更加重要的作用。

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

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

相关文章

1.2.神经网络基础

目录 1.2.神经网络基础 1.2.1.Logistic回归 1.2.2 梯度下降算法 1.2.3 导数 1.2.4 向量化编程 1.2.5 正向传播与反向传播 1.2.6.练习 1.2.神经网络基础 1.2.1.Logistic回归 1.2.1.1.Logistic回归 逻辑回归是一个主要用于二分分类类的算法。那么逻辑回归是给定一个x ,…

Matlab总提示内存不够用,明明小于电脑内存

目录 前言情况1&#xff08;改matlab最大内存限制&#xff09;情况2&#xff08;重启电脑&#xff09;情况3 前言 在使用matlab中&#xff0c;有时候需要占用的内存并没有超过电脑内存依旧会报错&#xff0c;提示内存不够用&#xff0c;可以尝试下面几种方法&#xff0c;总有一…

使用AI生成金融时间序列数据:解决股市场的数据稀缺问题并提升信噪比

“GENERATIVE MODELS FOR FINANCIAL TIME SERIES DATA: ENHANCING SIGNAL-TO-NOISE RATIO AND ADDRESSING DATA SCARCITY IN A-SHARE MARKET” 论文地址&#xff1a;https://arxiv.org/pdf/2501.00063 摘要 金融领域面临的数据稀缺与低信噪比问题&#xff0c;限制了深度学习在…

深入解析人工智能中的协同过滤算法及其在推荐系统中的应用与优化

目录 什么是协同过滤算法核心原理基本步骤相似度计算代码实现详解1.流程图2.创建基础的数据结构存储用户评分数据3.计算用户相似度4.获取相似用户5.推荐方法 算法优化建议1. 数据预处理优化去除异常值和噪声数据进行数据标准化使用稀疏矩阵优化存储 2. 相似度计算优化使用局部敏…

react install

react 安装 React 是一个用于构建用户界面的 JavaScript 库。以下是安装 React 的步骤&#xff1a; 使用 Create React App Create React App 是一个官方支持的命令行工具&#xff0c;用于快速搭建 React 应用。 安装 Node.js 和 npm 确保你的计算机上安装了 Node.js 和 npm…

程序员不可能不知道的常见锁策略

前面我们学习过线程不安全问题&#xff0c;我们通过给代码加锁来解决线程不安全问题&#xff0c;在生活中我们也知道有很多种类型的锁&#xff0c;同时在代码的世界当中&#xff0c;也对应着很多类型的锁&#xff0c;今天我们对锁一探究竟&#xff01; 1. 常见的锁策略 注意: …

智启未来,AI筑梦科技新星”------华清远见成都中心2025冬令营圆满结束

2025年1月11日-16日&#xff0c;华清远见成都中心为期6天的“智启未来&#xff0c;AI筑梦科技新星”2025冬令营活动圆满结束。此次活动吸引了众多对人工智能和无人驾驶技术充满热情的学生参与&#xff0c;共同开启了一段点燃科技梦想的精彩旅程。 报道接待 以AI无人驾驶小车为核…

Debezium日常分享系列之:对于从Oracle数据库进行快照的性能优化

Debezium日常分享系列之&#xff1a;对于从Oracle数据库进行快照的性能优化 源数据库Kafka Connect监控测试结果 源数据库 Oracle 19c&#xff0c;本地&#xff0c;CDB数据库主机的I/O带宽为6 GB/s&#xff0c;由此主机上运行的所有数据库共享临时表空间由42个文件组成&#x…

RabbitMQ--延迟队列

&#xff08;一&#xff09;延迟队列 1.概念 延迟队列是一种特殊的队列&#xff0c;消息被发送后&#xff0c;消费者并不会立刻拿到消息&#xff0c;而是等待一段时间后&#xff0c;消费者才可以从这个队列中拿到消息进行消费 2.应用场景 延迟队列的应用场景很多&#xff0c;…

3DsMax设置中文界面

按键盘上的“Win”键&#xff0c;直接输入3dsmax&#xff0c;选择Simplified Chinese打开&#xff0c;之后就都是中文了

opencv在图片上添加中文汉字(c++以及python)

opencv在图片上添加中文汉字&#xff08;c以及python&#xff09;_c opencv绘制中文 知乎-CSDN博客 环境&#xff1a; ubuntu18.04 desktopopencv 3.4.15 opencv是不支持中文的。 这里C代码是采用替换原图的像素点来实现的&#xff0c;实现之前我们先了解一下汉字点阵字库。…

线程同步与Mutex

梦想是逃离世界… 文章目录 一、什么是线程同步&#xff1f;二、线程同步机制三、互斥锁&#xff08;Mutex&#xff09;四、loock 和 unlock五、Mutex的四种类型 一、什么是线程同步&#xff1f; 线程同步(Thread Synchronization)是多线程编程中的一个重要概念&#xff0c;它…

基于SpringBoot和PostGIS的全球首都信息管理设计与实现

目录 前言 一、首都空间表的设计 1、三张空间表的结构 二、SpringBoot后台管理的设计与实现 1、模型层的实现 2、业务层及控制层实现 三、前端的实现与成果可视化 1、新增数据的保存 2、首都的实际管理成果 3、全球首都信息 四、总结 前言 首都&#xff0c;一个国家的…

计算机网络 (50)两类密码体制

前言 计算机网络中的两类密码体制主要包括对称密钥密码体制&#xff08;也称为私钥密码体制、对称密码体制&#xff09;和公钥密码体制&#xff08;也称为非对称密码体制、公开密钥加密技术&#xff09;。 一、对称密钥密码体制 定义&#xff1a; 对称密钥密码体制是一种传…

【数据结构篇】顺序表 超详细

目录 一.顺序表的定义 1.顺序表的概念及结构 1.1线性表 2.顺序表的分类 2.1静态顺序表 2.2动态顺序表 二.动态顺序表的实现 1.准备工作和注意事项 2.顺序表的基本接口&#xff1a; 2.0 创建一个顺序表 2.1 顺序表的初始化 2.2 顺序表的销毁 2.3 顺序表的打印 3.顺序…

C 语言雏启:擘画代码乾坤,谛观编程奥宇之初瞰

大家好啊&#xff0c;我是小象٩(๑ω๑)۶ 我的博客&#xff1a;Xiao Xiangζั͡ޓއއ 很高兴见到大家&#xff0c;希望能够和大家一起交流学习&#xff0c;共同进步。* 这一课主要是让大家初步了解C语言&#xff0c;了解我们的开发环境&#xff0c;main函数&#xff0c;库…

根据 Web 服务器端的架构相关知识,将PHP改JAVA重构企业网站系统

目录 案例 【题目】 【问题 1】(7 分) 【问题 2】(8 分) 【问题 3】(10 分) 答案 【问题 1】解析 【问题 2】解析 【问题 3】解析 相关推荐 案例 阅读以下关于应用服务器的叙述&#xff0c;在答题纸上回答问题 1 至问题 3。 【题目】 某电子产品制造公司&#xff0c…

多选multiple下拉框el-select回显问题(只显示后端返回id)

首先保证v-model的值对应options数据源里面的id <el-form-item prop"subclass" label"分类" ><el-select v-model"formData.subclass" multiple placeholder"请选择" clearable :disabled"!!formData.id"><e…

java快速导出word文档

点关注不迷路&#xff0c;欢迎再访&#xff01; 精简博客内容&#xff0c;尽量已行业术语来分享。 努力做到对每一位认可自己的读者负责。 帮助别人的同时更是丰富自己的良机。 文章目录 前言一.添加 Apache POI 依赖二.填充文档内容三.导出文档效果测试 前言 在 Java 应用程序…

《MambaIR:一种基于状态空间模型的简单图像修复基线方法》学习笔记

paper&#xff1a;2402.15648 目录 摘要 一、引言 1、模型性能的提升依赖于网络感受野的扩大&#xff1a; 2、全局感受野和高效计算之间存在固有矛盾&#xff1a; 3、改进版 Mamba的巨大潜力 4、Mamba 在图像修复任务中仍面临以下挑战&#xff1a; 5、方法 6、主要贡献…