【革命启示录】Spring框架:Java开发的“核聚变”能量源!

Hello,我是阿佑,今天给大家整的活是 《Java开发的“核聚变”能量源》

文章目录

  • Spring框架原理详解
    • 一、引言
      • 简介
      • 目的
      • 特点
      • 例子
    • 二、背景介绍
      • 问题
      • 解决方案
      • 例子
    • 三、核心概念
      • 3.1 控制反转(Inversion of Control, IoC)
        • 定义
        • 实现
        • 例子与代码
      • 3.2 面向切面编程(Aspect-Oriented Programming, AOP)
        • 定义
        • 组件
        • 例子与代码
      • 3.3 依赖注入(Dependency Injection, DI)
        • 方式
        • 目的
        • 例子与代码
    • 四、Spring架构与模块
      • 核心容器(Core Container)
        • BeanFactory
        • ApplicationContext
        • 例子与代码
      • AOP模块
        • 例子
      • 数据访问/集成(Data Access/Integration)
        • JDBC
        • ORM
      • Web模块
        • Spring MVC
        • 例子与代码
      • 测试模块
        • 例子与代码
      • Spring框架的国际化和本地化
        • 本地化消息支持
        • 国际化日期和数字格式
        • 地区敏感信息处理
        • 集成第三方库
        • 测试国际化和本地化

在这里插入图片描述

Spring框架原理详解

一、引言

想象一下,如果你是一位厨师,你的厨房里堆满了食材和工具,但它们都是乱七八糟的。你需要花费大量的时间去寻找一把刀或者一个锅,这无疑会降低你的工作效率。在软件开发的世界里,Spring框架就像是那个帮你整理厨房的助手,它将所有的食材(组件)和工具(服务)都井井有条地放好,让你可以快速地找到你需要的东西,专注于烹饪出美味的“软件大餐”。

简介

Spring是一个开源的、轻量级的Java开发框架,它就像是那个神奇的魔法棒,轻轻一挥,就能让复杂的企业级应用开发变得简单而高效。

目的

Spring的使命是简化企业级应用开发的复杂性,它通过一系列创新的设计模式和编程范式,让开发者能够更加专注于业务逻辑,而不是被底层的复杂性所困扰。

特点

Spring的三大法宝是分层架构、控制反转(IoC)和面向切面编程(AOP)。

  • 分层架构:就像一个精美的蛋糕,每一层都有其独特的风味和作用,Spring的分层架构保证了系统的清晰和模块化。
  • 控制反转(IoC):这是一种设计模式,它让对象的创建和依赖关系管理变得自动化,就像是有一个隐形的服务员,在你点菜后,自动为你准备好所有需要的食材。
  • 面向切面编程(AOP):这是一种编程范式,它允许你将那些与业务逻辑无关的横切关注点(如日志记录、安全性等)从业务逻辑中分离出来,就像是在厨房里安装了一个自动洗碗机,让你可以专注于烹饪,而不用担心清洗工作。

例子

让我们以一个餐厅点餐系统为例。在这个系统中,顾客(用户)可以通过菜单(界面)选择他们想要的菜品(功能)。在没有Spring的情况下,顾客可能需要直接与厨师(开发者)沟通,告诉他们需要什么菜品,然后厨师再去寻找食材和工具来制作菜品。这个过程不仅效率低下,而且如果厨师很忙,顾客可能就需要等待很长时间。

而有了Spring,这个过程就变得完全不同了。顾客只需要通过菜单选择他们想要的菜品,然后后厨(Spring容器)就会自动为他们准备好一切。厨师只需要专注于烹饪,而不需要担心其他的事情。这样,不仅提高了效率,而且也让整个餐厅的运营变得更加流畅。

接下来,我们将深入探讨Spring的背景介绍,看看它是如何一步步解决传统J2EE应用开发中遇到的问题的。

二、背景介绍

在Spring框架出现之前,Java企业级应用开发就像是在没有GPS导航的情况下开车穿越一座迷宫城市。开发者需要手动处理各种复杂的配置和依赖关系,就像是在没有地图的情况下寻找目的地,既费时又容易迷路。

问题

传统的J2EE应用开发面临的问题主要包括:

  • 复杂性高:企业级应用通常包含大量的组件和服务,这些组件之间的依赖关系错综复杂,导致整个系统的管理和维护变得非常困难。
  • 耦合度大:在传统的开发模式下,组件之间的依赖关系通常是硬编码的,这就意味着一旦某个组件发生变化,所有依赖它的组件都可能受到影响,从而导致整个系统的稳定性和可维护性大大降低。

解决方案

Spring框架的出现,就像是为这座迷宫城市带来了GPS导航系统,它通过引入新的设计模式和编程范式,为开发者提供了一种更加清晰和高效的开发方式。

  • 控制反转(IoC):Spring通过IoC机制,将对象的创建和依赖关系的管理从程序代码中分离出来,交由框架的容器来管理。这样,开发者就不需要再手动创建和管理对象,只需要通过简单的配置,就可以让容器自动为他们创建和管理对象,从而大大简化了开发过程。
  • 面向切面编程(AOP):Spring通过AOP机制,允许开发者将那些与业务逻辑无关的横切关注点(如日志记录、安全性等)从业务逻辑中分离出来,封装成独立的模块。这样,就可以在不修改业务逻辑代码的情况下,灵活地添加或修改这些横切关注点,从而提高了系统的模块化和可维护性。

例子

让我们继续以餐厅点餐系统为例。在传统的开发模式下,如果餐厅想要增加一个新的菜品,厨师可能需要手动修改整个点餐系统的代码,以添加这个新菜品。这个过程不仅繁琐,而且如果修改不当,还可能影响到其他菜品的制作。

而有了Spring,这个过程就变得非常简单了。厨师只需要定义一个新的菜品(Bean),然后通过简单的配置,就可以让Spring容器自动为这个新菜品创建和管理所需的食材和工具。这样,厨师就可以专注于烹饪,而不需要担心系统的复杂性。

通过引入IoC和AOP,Spring为Java企业级应用开发带来了革命性的变化,它极大地简化了开发过程,提高了系统的模块化和可维护性。在下一章中,我们将深入探讨Spring的核心概念,包括控制反转(IoC)、面向切面编程(AOP)和依赖注入(DI),看看这些概念是如何在Spring中发挥作用的。
在这里插入图片描述

三、核心概念

Spring框架的核心概念是构建Java企业级应用的基石。下面我们来一一探讨。

3.1 控制反转(Inversion of Control, IoC)

控制反转是一种设计原则,它将传统编程中由程序代码直接管理对象创建和依赖关系的方式,转变为由外部容器(如Spring IoC容器)来管理。

定义

在IoC中,对象不是由程序代码创建的,而是由容器在运行时动态创建和注入的。

实现

Spring通过BeanFactoryApplicationContext接口来实现IoC,使用BeanDefinition来描述Bean的配置信息。

例子与代码

假设我们有一个简单的MessageService接口和它的实现ConsoleMessageService

// 定义一个简单的服务接口
public interface MessageService {
    void showMessage(String message);
}

// 实现这个接口
public class ConsoleMessageService implements MessageService {
    public void showMessage(String message) {
        System.out.println(message);
    }
}

在Spring配置文件中,我们可以这样定义Bean:

<!-- Spring配置文件 -->
<beans xmlns="http://www.springframework.org/schema/beans"
       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">

    <!-- 定义一个MessageService的Bean -->
    <bean id="messageService" class="com.example.ConsoleMessageService"/>
</beans>

现在,我们不需要在代码中创建ConsoleMessageService的实例,而是通过Spring容器来获取:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Client {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        MessageService messageService = context.getBean("messageService", MessageService.class);
        messageService.showMessage("Hello, Spring IoC!");
    }
}

3.2 面向切面编程(Aspect-Oriented Programming, AOP)

面向切面编程是一种编程范式,它允许将横切关注点(如日志、事务管理等)与业务逻辑分离。

定义

AOP通过将这些横切关注点模块化,可以对它们进行单独的管理和维护。

组件
  • Joinpoint:程序执行的特定点,如方法的调用或异常的处理。
  • Pointcut:定义一个或多个Joinpoint的表达式。
  • Advice:在Joinpoint处执行的代码,分为前置、后置、环绕和异常处理等类型。
  • Aspect:一个或多个Advice的集合,它可以根据Pointcut表达式应用到Joinpoint上。
例子与代码

假设我们想要在调用MessageService时添加日志记录功能。

// 定义一个日志切面
public class LoggingAspect {
    public void beforeAdvice(Method method, Object[] args) {
        System.out.println("Before the method: " + method.getName());
    }
    
    public void afterAdvice(Method method) {
        System.out.println("After the method: " + method.getName());
    }
}

在Spring配置文件中,我们可以这样定义切面:

<!-- 定义一个切面 -->
<bean id="loggingAspect" class="com.example.LoggingAspect"/>

<!-- 定义一个切入点 -->
<bean id="loggingPointcut" class="org.springframework.aop.aspectj.AspectJExpressionPointcut">
    <property name="expression" value="execution(* com.example.MessageService.*(..))"/>
</bean>

<!-- 将Advice应用到切入点 -->
<aop:config>
    <aop:aspect id="loggingAspectBean" ref="loggingAspect">
        <aop:before method="beforeAdvice" pointcut-ref="loggingPointcut"/>
        <aop:after method="afterAdvice" pointcut-ref="loggingPointcut"/>
    </aop:aspect>
</aop:config>

3.3 依赖注入(Dependency Injection, DI)

依赖注入是一种实现IoC的技术,它允许容器动态地将依赖关系注入到需要它们的组件中。

方式
  • 构造器注入:通过构造器参数来注入依赖。
  • Setter方法注入:通过公共的Setter方法来注入依赖。
  • 字段注入:直接在字段上注入依赖(不推荐,因为会丧失灵活性)。
目的

降低组件之间的耦合,提高代码的可测试性和可维护性。

例子与代码

假设ConsoleMessageService需要一个NotificationService来发送通知。

public class NotificationService {
    public void sendNotification(String message) {
        System.out.println("Notification: " + message);
    }
}

我们可以通过构造器注入来提供这个依赖:

public class ConsoleMessageService implements MessageService {
    private NotificationService notificationService;

    // 通过构造器注入NotificationService
    public ConsoleMessageService(NotificationService notificationService) {
        this.notificationService = notificationService;
    }

    public void showMessage(String message) {
        System.out.println(message);
        notificationService.sendNotification(message);
    }
}

在Spring配置文件中,我们可以这样定义这个Bean,并注入依赖:

<bean id="messageService" class="com.example.ConsoleMessageService">
    <constructor-arg ref="notificationService"/>
</bean>

<bean id="notificationService" class="com.example.NotificationService"/>

通过这些核心概念,Spring提供了一种强大而灵活的方式来构建和管理复杂的Java企业级应用。接下来,我们将探讨Spring的架构与模块,了解它们是如何协同工作的。
在这里插入图片描述

四、Spring架构与模块

Spring框架的架构设计非常灵活,它由多个模块组成,每个模块都负责特定的功能,这些模块可以独立使用,也可以组合使用以构建更复杂的应用。

核心容器(Core Container)

核心容器是Spring框架的核心,它提供了基本的IoC容器功能,以及对DI的支持。

BeanFactory

BeanFactory是Spring框架中最基本的IoC容器,它负责管理Bean的生命周期和依赖关系。BeanFactory是延迟初始化的,只有在第一次请求一个Bean时,它才会被创建和初始化。

ApplicationContext

ApplicationContextBeanFactory的子接口,它提供了更多的高级功能,如事件发布和监听、国际化消息支持等。ApplicationContext通常用于应用程序的整个生命周期。

例子与代码

以下是如何使用ApplicationContext来获取一个Bean的示例:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ApplicationContextExample {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        MessageService messageService = context.getBean(MessageService.class);
        messageService.showMessage("Hello, Spring ApplicationContext!");
    }
}

AOP模块

AOP模块提供了面向切面编程的支持,允许开发者将横切关注点与业务逻辑分离。

例子

假设我们有一个UserService,我们希望在执行每个方法之前记录日志:

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect
public class UserServiceLoggingAspect {
    @Before("execution(* com.example.UserService.*(..))")
    public void logBefore(JoinPoint joinPoint) {
        System.out.println("Before method: " + joinPoint.getSignature().getName());
    }
}

数据访问/集成(Data Access/Integration)

数据访问/集成模块提供了对各种数据访问技术的集成,如JDBC、ORM(对象关系映射)和事务管理。

JDBC

Spring的JDBC模块简化了JDBC的使用,通过使用JdbcTemplate,可以减少样板代码,提高数据访问层的可维护性。

ORM

Spring支持多种ORM框架,如Hibernate、JPA等,提供了事务管理的支持。

Web模块

Web模块提供了构建Web应用的支持,包括MVC模型和其他Web集成特性。

Spring MVC

Spring MVC是一个基于模型-视图-控制器的Web应用框架,它通过注解或XML配置来简化Web应用的开发。

例子与代码

以下是使用Spring MVC的控制器示例:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class MyController {

    @GetMapping("/hello")
    public String sayHello() {
        return "hello"; // 返回视图的名称
    }
}

测试模块

测试模块提供了对JUnit等测试框架的集成支持,使得编写单元测试和集成测试变得更加容易。

例子与代码

以下是使用Spring的测试模块进行单元测试的示例:

import org.springframework.beans.factory.annotation.Autowired;
import org.junit.jupiter.api.Test;
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;

class UserServiceTest {
    @Autowired
    private UserService userService;

    @Test
    void testFindUser() {
        // 创建模拟的用户
        User user = new User("John");
        // 配置模拟对象返回特定的用户
        when(userService.findUser(1L)).thenReturn(user);

        // 调用方法并断言结果
        User result = userService.findUser(1L);
        assertEquals(user, result);
    }
}

通过这些模块的协同工作,Spring框架为开发者提供了一个强大而灵活的平台,用于构建各种类型的Java应用。

Spring框架的国际化和本地化

在全球化的软件开发背景下,国际化(Internationalization,通常缩写为 I18N)和本地化(Localization,通常缩写为 L10N)变得越来越重要。国际化是指设计和开发能够无障碍地适应不同文化和语言环境的产品的过程。本地化则是指将国际化的产品调整、翻译和适应特定地区的过程。

本地化消息支持

在Spring框架中,可以使用MessageSource接口来支持本地化消息。这通常涉及到在应用程序中使用键值对来存储消息,并根据用户的地区设置从相应的属性文件中检索翻译后的文本。

示例代码:使用MessageSource

@Controller
public class MessageController {

    @Autowired
    private MessageSource messageSource;

    @GetMapping("/message")
    public String showMessage(@RequestParam String code, Model model) {
        model.addAttribute("message", messageSource.getMessage(code, null, null));
        return "message";
    }
}

在资源文件(例如:messages.properties 用于默认区域设置,messages_es.properties 用于西班牙语区域设置)中,消息被定义如下:

# messages.properties
message.welcome=Welcome to our store!
# messages_es.properties
message.welcome=¡Bienvenido a nuestra tienda!
国际化日期和数字格式

Spring框架支持国际化的日期和数字格式,这通常是通过Java的Locale类和java.text包来实现的。

示例代码:国际化日期格式

@GetMapping("/format-date")
public String formatDate(@RequestHeader(value = "Accept-Language", required = false) String lang,
                          Model model) {
    Locale locale = lang != null ? new Locale(lang.split("-", 2)[0]) : Locale.getDefault();
    DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
    model.addAttribute("currentDate", dateFormat.format(new Date()));
    return "date";
}
地区敏感信息处理

在处理与地区相关的信息时,如货币、地址格式等,Spring框架可以与Java的国际化库一起使用,以确保正确地格式化和解析这些信息。

示例代码:地区敏感的货币格式化

public String getFormattedCurrency(double amount, String countryCode) {
    Locale locale = new Locale("", countryCode);
    NumberFormat currencyFormat = NumberFormat.getCurrencyInstance(locale);
    return currencyFormat.format(amount);
}
集成第三方库

Spring框架可以与许多第三方库集成,如Apache Commons Lang和Java Internationalization API,以支持更复杂的国际化和本地化需求。

示例代码:使用Apache Commons Lang进行地区感知的排序

public List<String> sortCountries(Locale locale, List<String> countries) {
    Collator collator = Collator.getInstance(locale);
    collator.setStrength(Collator.PRIMARY);
    Collections.sort(countries, collator);
    return countries;
}
测试国际化和本地化

在测试国际化和本地化功能时,需要确保应用程序在不同的区域设置下表现一致。

示例代码:使用JMockit进行国际化测试

@Test
public void testLocalizedMessage(@Mocked final LocaleService mockLocaleService,
                                @Mocked final MessageSource mockMessageSource) {
    new Expectations() {{
        mockLocaleService.getLocale();
        result = Locale.FRENCH;
        mockMessageSource.getMessage("message.welcome", null, Locale.FRENCH);
        result = "Bienvenue sur notre site!";
    }};
    // 测试代码
}

通过这些策略,Spring框架支持开发者构建出既国际化又本地化的应用,满足全球用户的多样化需求。如果您需要更具体的示例或有其他问题,请继续提问。

接下来,我们将探讨Bean的生命周期,了解Spring是如何管理Bean的生命周期的。
在这里插入图片描述
通过这四个部分的介绍,我们对Spring框架的基本原理和核心概念有了全面的了解。Spring框架通过其分层架构和模块化设计,提供了强大的功能来简化企业级应用的开发。

下一篇,阿佑准备和大家进一步探讨Spring框架的其他方面,如Bean的生命周期管理、事务管理、与其他技术的集成等。欢迎持续关注!

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

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

相关文章

04-28 周日 FastAPI Post请求同时传递文件和普通参数

04-28 周日 FastAPI Post请求同时传递文件和普通参数 时间版本修改人描述04-28 周日V0.1宋全恒新建文档2024年5月6日14:20:05V1.0宋全恒完成文档的传递 简介 由于在重构FastBuild的时候&#xff0c;为了支持TLS是否启用&#xff0c;在接口中需要同时传递文件参数和其他参数&am…

应急响应靶机训练-近源渗透OS-1

前言 应急响应靶机训练&#xff0c;为保证每位安服仔都有上手的机会&#xff0c;不做理论学家&#xff0c;增加动手经验&#xff0c;可前来挑战应急响应靶机-近源渗透OS1,此系列后期会长期更新&#xff0c;关注本公众号&#xff0c;被动学习。 挑战内容 前景需要&#xff1a;…

Spring Gateway的核心功能:路由、过滤、限流一网打尽

Spring Gateway的简介 在微服务架构的世界里&#xff0c;如同繁星点点的服务需要一个指挥家&#xff0c;将它们有序地组织起来&#xff0c;让它们能够和谐地协同工作。这个指挥家&#xff0c;就是Spring Gateway。它是一个基于Spring Framework 5、Project Reactor和Spring Bo…

Java多线程:常见的线程的创建方法及Thread类详解

目录 一.并发编程相关概念 线程与进程 多线程 Java中线程的状态 二.线程的创建方法 方法一&#xff1a;继承Thread类 方法二&#xff1a;实现Runnable接口 其他方法 三.Thread类详解 Thread常见构造方法 Thread常见属性 Thread常见方法 start() 与 run() sleep(…

使用代理IP时,如何预防未知的风险?

在使用代理IP时&#xff0c;预防未知的风险是至关重要的。代理IP虽然提供了诸多便利&#xff0c;如匿名浏览、访问控制和内容过滤等&#xff0c;但如果不加以妥善管理和使用&#xff0c;可能会面临数据泄露、隐私暴露、恶意活动关联等风险。以下是一些建议&#xff0c;以帮助您…

Java中的maven的安装和配置

maven的作用 依赖管理 方便快捷的管理项目依赖的资源&#xff0c;避免版本冲突问题 统一项目管理 提供标准&#xff0c;统一的项目结构 项目构建 标准跨平台&#xff08;Linux、windows、MacOS&#xff09;的自动化项目构建方式 maven的安装和配置 在maven官网下载maven Ma…

如何用Kimi,5秒1步生成流程图

引言 在当前快节奏的工作环境中&#xff0c;拥有快速、专业且高效的工具不可或缺。 Kimi不仅能在5秒内生成专业的流程图&#xff08;kimi&#xff09;&#xff0c;还允许实时编辑和预览&#xff0c;大幅简化了传统流程图的制作过程。 这种迅速的生成能力和高度的可定制性使得…

如何使用低代码快速创建一个复杂交叉报表?

前言 在当今数字化时代&#xff0c;数据是企业决策和发展的重要支柱。为了更好地理解和利用数据&#xff0c;生成清晰、全面的报表至关重要。而复杂交叉报表作为一种高级数据分析工具&#xff0c;能够帮助企业深入挖掘数据背后的价值&#xff0c;提供全面的数据概览和分析结果…

数据分析——业务指标量化

业务指标量化 前言一、统计指标二、统计指标特点完整的统计指标统计指标的理解和使用方法 三、统计指标类型总量指标时期指标时点指标总量指标的作用 相对指标计划完成相对数指标结构相对数指标比例相对数指标比较相对数指标动态相对数指标 平均指标 四、数量指标和质量指标五、…

Java设计模式 _结构型模式_代理模式(静态,动态)

一、基础概念 1、代理模式 代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式。它允许我们通过添加一个代理对象来控制对另一个对象的访问&#xff0c;从而实现一些额外的功能&#xff0c;如访问控制、日志记录、性能监控等。代理模式主要分为静态代理和动态…

Versatile Diffusion—— 融合文本和图像的扩散模型

介绍 Diffusion模型在各种生成任务中取得了显著的进展&#xff0c;成为了一个重要的里程碑。特别是像DALLE 2、Imagen和Stable Diffusion&#xff08;SD&#xff09;这样的模型&#xff0c;不仅在学术界引起了广泛关注&#xff0c;也在工业界产生了深远影响。尽管这些模型在特…

10.Java对象内置结构

文章目录 Java对象内置结构1.Java对象的三个部分1.1.对象头1.2.对象体1.3.对齐字节 2.对象结构中核心字段的作用2.1.MarkWord(标记字)2.2.Class Pointer(类对象指针)2.3.Array Length(数组长度)2.4.对象体2.5.对齐字节 3.Mark Word的结构信息3.1.不同锁状态下的Mark Word字段结…

K邻算法:在风险传导中的创新应用与实践价值

程序员的实用神器 ⛳️ 写在前面参与规则&#xff01;&#xff01;&#xff01; ✅参与方式&#xff1a;关注博主、点赞、收藏、评论&#xff0c;任意评论&#xff08;每人最多评论三次&#xff09; ⛳️本次送书1~4本【取决于阅读量&#xff0c;阅读量越多&#xff0c;送的越…

Ubuntu24.04安装中文输入法

Ubuntu24.04安装中文输入法 为了更好的体验&#xff0c;请访问个人博客 www.huerpu.cc:7000 一、添加中文语言支持 在安装中文输入法之前&#xff0c;首选要添加中文语言支持。选择System&#xff0c;点击Region & Language。 点击Manage Install Languages。 点击Insta…

LED显示屏的维护与使用指南

LED显示屏作为一种先进的显示技术&#xff0c;广泛应用于广告、信息显示、舞台背景等领域。然而&#xff0c;为了确保显示屏的长期稳定运行和良好的显示效果&#xff0c;对其进行正确的维护和使用是非常必要的。以下是一些专业的维护与使用建议&#xff1a; 维护建议&#xff1…

Android iw 工具

代码位置:Android/external/iw 查看支持的命令: console:/ # iw help Usage: iw [options] command Options:--debug enable netlink debugging--version show version (4.1) Commands:help [command]Print usage for all or a specific command, e.g."…

六西格玛管理培训公司挑选攻略:如何找到最适合你的合作伙伴?

面对众多提供六西格玛管理培训的公司&#xff0c;企业如何挑选到真正适合自己的呢&#xff1f;本文有建议如下&#xff1a; 一、明确培训目标 在选择六西格玛管理培训公司之前&#xff0c;企业首先要明确自身的培训需求和目标。这包括确定培训的范围、期望达到的效果以及预算…

docker-compose完成mysql8.0+环境搭建

1、准备my.cnf文件到指定目录&#xff08;和基础的增加了一个default_authentication_pluginmysql_native_password 的身份验证插件配置信息&#xff09; 原因&#xff1a;官方提到&#xff1a; 该方式可以解决&#xff1a;Authentication plugin ‘caching_ sha2_password‘ c…

【代码分享】使用HTML5的Canvas绘制编码说明图片

最急在工作中遇到一个需求&#xff0c;根据给定的编码生成编码说明&#xff0c;像下面这样的效果。 不同含义的编码用横杠分割&#xff0c;然后每个编码下面用箭头指明具体的含义。下面是我使用canvas实现的代码。具体的编码宽度大家可以根据实际情况进行调整&#xff0c;目前…

炒股沪指放量涨逾1%,医药、酿酒等板块强势

5月首个交易日,两市股指高开高走,盘中大幅单边上行,两市成交额连续4个交易日突破万亿元,北向资金大举进场扫货,一度净买入超100亿元。 同创优配是AAA 级诚信经营示范单位,中国人民银行备案认证,天眼查可查询。是一家专注于股票投资、金融服务、及资产管理的专业机构 截至收盘…